You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多目录Zip归档脚本故障:仅处理首个指定目录路径

问题原因
  • 数组引用错误:原脚本里for d in "$start_dir"/*/中的"$start_dir"只会读取数组的第一个元素,导致仅处理首个目录。遍历数组所有元素必须用"${start_dir[@]}"语法。
  • 目录切换未恢复:cd到子目录后未返回上层目录,处理第二个起始目录时会处于第一个起始目录的子目录下,导致路径查找失败。
  • 数组输出错误:echo "start_dir=$start_dir"只能显示数组第一个元素,无法正确打印所有起始路径。
修复后的脚本
#!/bin/bash

start_dir=(/root/Inbound /root/Outbound)

# 正确打印所有起始目录路径
echo "start_dir=${start_dir[@]}"

# 遍历数组中的每个起始目录
for root_dir in "${start_dir[@]}"; do
    # 跳过不存在的目录
    if [ ! -d "$root_dir" ]; then
        echo "目录 $root_dir 不存在,跳过"
        continue
    fi

    # 遍历当前起始目录下的所有子目录
    for d in "$root_dir"/*/ ; do
        # 跳过非目录(比如通配符无匹配时的原字符串)
        [ -d "$d" ] || continue

        # 直接用绝对路径获取子目录,避免cd切换目录的问题
        sub_dirs=("$d"*/)
        declare -p sub_dirs
        echo "处理目录: $d"

        for sub_dir in "${sub_dirs[@]}"; do
            [ -d "$sub_dir" ] || continue
            echo "压缩子目录: $sub_dir"
            # 生成不带末尾斜杠的zip文件名
            zip_filename="${sub_dir%/}.zip"
            zip -r "$zip_filename" "$sub_dir"
        done
    done
done
关键修改说明
  • 用"${start_dir[@]}"遍历数组所有元素,确保每个起始目录都被处理。
  • 放弃cd切换目录的方式,直接通过绝对路径操作子目录,彻底避免目录切换后未恢复的问题。
  • 添加目录存在性检查,避免因目录不存在或通配符无匹配时触发错误。
  • 修正数组输出逻辑,能正确打印所有起始路径,方便调试。

内容的提问来源于stack exchange,提问作者Gowmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:04:55