多目录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
相关产品推荐
相关产品推荐

