Shell脚本进入子目录生成对应Zip文件的错误排查与修正
问题分析与脚本修正
错误原因
当前脚本的核心问题是未进入目标子目录就执行打包操作:
- 循环遍历
*/得到子目录路径后,直接在起始目录执行zip -r "${subdir%/}.zip" .,这里的.代表起始目录的全部内容,导致打包了整个起始目录下的所有文件和子目录,而非目标子目录的内容。
修正后的脚本
#!/bin/bash startdir=( "/workspace/input/data" ) for dir in "${startdir[@]}"; do # 进入起始目录,失败则跳过 cd "$dir" || continue # 遍历所有子目录 for subdir in */; do # 去掉路径末尾的斜杠,得到子目录名 subdir_name="${subdir%/}" # 进入子目录,失败则跳过该子目录 if cd "$subdir"; then # 打包当前子目录内的所有内容,生成以子目录命名的zip文件 zip -r "${subdir_name}.zip" . # 返回起始目录,继续处理下一个子目录 cd .. fi done done
关键修正点说明
- 新增
cd "$subdir"进入目标子目录,确保打包操作的上下文是子目录内部 - 加入
cd ..返回起始目录,保证后续循环能正确遍历下一个子目录 - 增加
if cd "$subdir"判断,避免因子目录不存在或权限问题导致脚本异常
执行效果验证
修正后执行脚本,每个子目录(如A、B、C、D)内会生成对应的A.zip、B.zip等文件,zip包内仅包含该子目录自身的内容,不会包含其他子目录的文件。
内容的提问来源于stack exchange,提问作者Gowmi
相关产品推荐
相关产品推荐

