如何遍历d066到d166命名的子文件夹,逐个对内部文件执行指定函数?
问题根因
- 循环范围设置错误:你需要处理的是d066到d166,但是当前循环写的是
{60..166},会尝试进入不存在的d060到d065文件夹 - 错误退出逻辑不合理:
cd $var2 || exit碰到不存在的文件夹会直接终止整个脚本,而不是跳过当前错误文件夹继续执行 - 路径切换风险高:多次
cd切换目录,一旦任意步骤(比如gd2e.py执行过程中意外修改了工作目录、或者cd $var2失败后仍执行了cd ..)都会导致后续路径全部错乱,甚至直接退出到上层目录后找不到目标子文件夹,触发exit逻辑直接终止脚本。
稳妥实现方案
推荐从根源避免工作目录切换的风险,优化后脚本如下:
#!/bin/bash # 循环范围调整为实际需要的66到166 for i in {66..166}; do # 用printf自动补前导0生成文件夹名,无需单独判断数值大小 dir_name=$(printf "d%03d" $i) # 文件夹不存在直接跳过,不终止整个任务 if [ ! -d "$dir_name" ]; then continue fi # 直接获取文件夹内第一个文件,无需进入目录 target_file=$(find "$dir_name" -type f | head -n 1) if [ -z "$target_file" ]; then echo "警告:$dir_name 内无有效文件,跳过" continue fi # 用子shell执行目录切换和命令,子shell内的目录变更不会影响父shell的工作路径 ( cd "$dir_name" || exit 1 gd2e.py -rnxFile "$(basename "$target_file")" ) done
优化点说明
- 文件名生成逻辑更简洁,用
printf自动格式化补0,减少分支判断出错概率 - 增加文件夹、文件存在性校验,异常场景直接跳过,不会中断整个批量任务
- 子shell隔离目录操作,父shell始终停放在所有子文件夹的上层目录,不会出现路径错乱退出的问题
- 所有变量加双引号包裹,兼容文件名/文件夹名带空格的场景
内容的提问来源于stack exchange,提问作者Nihilum
相关产品推荐
相关产品推荐

