【发布时间】:2018-03-11 23:01:34
【问题描述】:
我正在尝试在目录中运行 python 脚本并使用 bash 将此脚本应用于其每个子目录。
我在 unix 堆栈交换上找到了一个脚本,它为一组子目录 here 执行此操作。但我希望它递归地适用于所有子目录。
问题是我在父目录中有一个wav.py,但在子目录中没有。
for d in ./*/ ; do (cd "$d" && python3 $1 SA1.wav); done
如您所见,$1 (wav.py) 是我调用 bash 脚本时设置的 python 文件的路径。我还希望路径与我遍历的子目录树的级别相关。我知道我可以使用绝对路径。但这会在以后引起问题,所以我想避免它。
例如。 1级
for d in ./*/ ; do (cd "$d" && python3 "../$1" SA1.wav); done
2 级
for d in ./*/ ; do (cd "$d" && python3 "../../$1" SA1.wav); done
对不起,如果这看起来微不足道。我还是 bash 的新手。
其他信息:
这是我的完整目录路径:
root@Chiku-Y700:/mnt/e/Code/Python - WorkSpace/timit/TIMIT/TEST/DR1# bash recursive.sh wav.py suit rag
我要运行的完整命令是:
python3 $1 SA1.wav $2 SA2.wav $3
$2 和 $3 与任何目录信息无关。
我明白了:
python3: 无法打开文件 '/mnt/e/Code/Python': [Errno 2] 没有这样的文件或目录
这个错误在 11 个子目录中出现了 12 次。
【问题讨论】:
-
使用脚本的绝对路径有什么问题?如果您正在 cd'ing 到任意深度的子目录,则导出脚本的相对路径可能会非常麻烦。此外,尚不清楚您为什么要遍历子目录。您是否从那里提取任何文件?
-
我的目录名中有时会有空格。那些没有得到正确解析。并在空格前添加“\”也无济于事。我的子目录也在 4-5 深度后停止
-
出于好奇,是否可以将目录名称从“Python - Workspace”更改为“Python-Workspace”。就像删除名称中的空格并尝试它。这样您就不必处理脚本中的空间。其次,你能说出 1 美元、2 美元和 3 美元是什么吗?可以指定您要运行的完整脚本(不包括变量),我们很容易理解您在寻找什么。另外我相信当你 cd 进入一个目录时,你应该从你开始的目录出来,因为你给出了相对路径。你可以试试
cd -回来。 -
您可以跳过告诉 $1、$2 和 $3。我重新阅读了您的问题,并且能够得到 $1 是 wav.py。和 $2, $3 只是脚本的参数。