Bash脚本遍历子目录异常:仅处理首个目录,请求修正
问题分析
- 数组调用错误:
startdir是数组变量,但直接执行cd "$startdir"时,bash只会读取数组的第一个元素,因此仅会切换到/root/Archive/EKS/data,完全未处理第二个路径。 - 缺少数组遍历逻辑:脚本没有循环遍历数组内的所有路径,自然无法对第二个目录执行压缩操作。
修正后的脚本(方式1:切换目录处理)
#!/bin/bash startdir=( "/root/Archive/EKS/data" "/root/Incoming/data" ) # 遍历数组中的每个目标路径 for dir in "${startdir[@]}"; do # 切换到目标目录,失败则跳过当前路径继续执行 cd "$dir" || { echo "无法进入目录: $dir"; continue; } # 压缩当前目录下的所有子目录 for sub_dir in */ ; do zip -r "${sub_dir%/}.zip" "$sub_dir" done done
修正后的脚本(方式2:不切换目录,绝对路径处理,更安全)
这种方式避免频繁切换目录导致的路径混乱,适合批量场景:
#!/bin/bash startdir=( "/root/Archive/EKS/data" "/root/Incoming/data" ) # 遍历数组中的每个目标路径 for dir in "${startdir[@]}"; do # 先检查目录是否存在 if [ ! -d "$dir" ]; then echo "目录不存在: $dir" continue fi # 用绝对路径遍历子目录并压缩 for sub_dir in "$dir"/*/ ; do sub_name=$(basename "${sub_dir%/}") zip -r "$dir/${sub_name}.zip" "$sub_dir" done done
核心修正点
- 用
for dir in "${startdir[@]}"遍历数组所有元素,确保每个路径都被处理。 - 替换
exit为continue,避免单个路径处理失败导致整个脚本终止,提升鲁棒性。 - 方式2采用绝对路径操作,无需切换目录,规避路径上下文混乱问题,稳定性更强。
内容的提问来源于stack exchange,提问作者Gowmi
相关产品推荐
相关产品推荐

