如何通过Bash实现Python脚本递归遍历所有子目录执行?
嘿,这个递归遍历子目录运行脚本的需求我熟!之前只能处理一级子目录的脚本确实不够用,我给你两个靠谱的解决方案,保证能覆盖所有层级的子目录,还能满足你对路径的要求~
解决方案1:用绝对路径调用(简单可靠)
这种方式不用纠结相对路径的层级计算,直接把wav.py的路径转换成绝对路径,不管遍历到哪个子目录都能直接调用,省心又不容易出错。
把下面的内容保存成run_wav_recursive.sh脚本:
#!/bin/bash # 检查用户是否传入了wav.py的路径 if [ $# -ne 1 ]; then echo "用法: $0 <wav.py的路径>" exit 1 fi # 将传入的wav.py路径转为绝对路径,避免层级切换导致的路径错误 WAV_PY_ABS=$(realpath "$1") # 递归遍历当前目录下所有子目录(排除当前目录本身) find . -type d -not -path '.' | while read -r dir; do echo "正在处理目录: $dir" # 切换到目标子目录,切换失败则跳过 cd "$dir" || continue # 运行Python脚本 python "$WAV_PY_ABS" # 切回原工作目录(静默输出,避免冗余信息) cd - > /dev/null done
脚本解释:
realpath "$1":把你传入的wav.py路径(不管是相对还是绝对)转换成绝对路径,这样后续切换目录后也能精准找到脚本;find . -type d -not -path '.':递归找出当前目录下所有层级的子目录,同时排除当前目录本身,避免重复执行;- 循环里的
cd "$dir" || continue:确保切换到子目录失败时直接跳过,防止脚本报错中断。
解决方案2:用相对路径调用(符合层级要求)
如果你坚持要让脚本调用路径随目录层级变化(比如子目录用../wav.py,孙子目录用../../wav.py),可以用这个版本:
#!/bin/bash if [ $# -ne 1 ]; then echo "用法: $0 <wav.py的路径>" exit 1 fi # 获取wav.py所在目录的绝对路径 WAV_DIR_ABS=$(realpath "$(dirname "$1")") # 获取当前工作目录的绝对路径 CURRENT_DIR_ABS=$(realpath .) # 递归遍历所有子目录 find . -type d -not -path '.' | while read -r dir; do echo "正在处理目录: $dir" cd "$dir" || continue # 计算当前子目录相对于wav.py所在目录的相对路径 REL_PATH=$(realpath --relative-to . "$WAV_DIR_ABS") # 构造wav.py的相对路径 WAV_PY_REL="$REL_PATH/$(basename "$1")" # 用相对路径运行脚本 python "$WAV_PY_REL" cd - > /dev/null done
这个版本会自动计算每个子目录到wav.py所在目录的相对路径,生成符合层级的调用路径,完全满足你的需求。
快速一行命令版
如果不想写脚本,直接用这条命令就能搞定(在父目录下运行):
find . -type d -not -path '.' -exec sh -c 'cd "$0" && python "$1"' {} "$(realpath ./wav.py)" \;
这条命令的逻辑和解决方案1一致,用find配合-exec直接在每个子目录里调用绝对路径的wav.py。
使用方法
- 给脚本添加执行权限:
chmod +x run_wav_recursive.sh
- 在父目录下运行脚本,传入
wav.py的路径:
./run_wav_recursive.sh ./wav.py
内容的提问来源于stack exchange,提问作者Srikanth Gopalakrishnan
相关产品推荐
相关产品推荐

