如何编写Bash for循环遍历目录下所有子目录执行分析任务?
批量处理子目录的Bash循环优化方案
嘿,我帮你优化一下这个批量处理的Bash循环——手动列48个目录名实在太折腾了,先看看你的场景:
我有一个目录,其中包含48个子目录,示例目录结构如下:
output$ ll total 0 drwxr-sr-x+ 1 xxx 576 Apr 27 16:39 ./ drwxrws---+ 1 xxx 254 May 4 15:12 ../ drwxrws---+ 1 xxx 28 Apr 19 16:31 404904/ drwxrws---+ 1 xxx 28 Apr 19 16:31 404905/ drwxrws---+ 1 xxx 28 Apr 19 16:31 405003/ drwxrws---+ 1 xxx 28 Apr 19 16:31 405050/ drwxrws---+ 1 xxx 28 Apr 19 16:31 405077/ ...
我希望编写一个Bash for循环,在这些子目录中执行通用分析任务,初步写法示例如下:
for d in {404904,404905,405503,...}; do echo $d # do...的内容 done
下面给你几个更高效的实现方案,根据你的实际目录情况选就行:
方案1:自动匹配所有数字命名子目录(无干扰目录时用)
如果当前目录下只有这些数字命名的子目录,没有其他无关目录,直接用通配符遍历最省心:
for d in [0-9]*/; do echo "Processing directory: $d" # 在这里写你的分析任务代码,举两个常用写法: # 写法1:进入目录执行任务后返回 pushd "$d" || continue # 进入失败就跳过 ./run_analysis.sh # 你的分析脚本 popd # 回到上级目录 # 写法2:直接传入目录路径给脚本 # ./run_analysis.sh "$d" done
[0-9]*/ 会匹配所有以数字开头的子目录,末尾的/确保只选目录而非文件
方案2:精准匹配特定格式的目录
如果目录都是40xxxx这种6位数字格式,且存在其他无关目录,可以用更精准的通配符:
for d in 40[0-9][0-9][0-9][0-9]/; do echo "Processing directory: $d" # 执行你的分析任务 done
这个模式只会匹配以40开头、后面跟4位数字的子目录,不会误处理其他目录。
方案3:用数组指定精确目录列表(目录不规律时用)
如果目录名没有统一规律,或者需要排除个别目录,把所有目标目录放进数组里更稳妥,还能加存在性检查避免报错:
# 把48个目录名依次放进数组里 target_dirs=( 404904 404905 405003 405050 405077 # 继续添加剩下的目录... ) for d in "${target_dirs[@]}"; do if [ -d "$d" ]; then echo "Processing directory: $d" # 执行分析任务 else echo "Warning: Directory $d does not exist, skipping..." fi done
内容的提问来源于stack exchange,提问作者David Z
相关产品推荐
相关产品推荐

