我正在尝试在目录中运行python脚本,并使用bash将此脚本应用于其每个子目录。
我在unix堆栈交换上找到了一个脚本,用于为一组子目录here执行此操作。但我希望递归地适用于所有子目录。
问题是我在父目录中有一个wav.py
但在子目录中没有。{/ p>
for d in ./*/ ; do (cd "$d" && python3 $1 SA1.wav); done
正如你所看到的那样,当我调用bash脚本时,$ 1(wav.py)是我的python文件集的路径。我还希望路径相对于我遍历的子目录树的多少级别。我知道我可以使用绝对路径。但它会在以后引起问题,所以我想避免它。
EG。为1级
for d in ./*/ ; do (cd "$d" && python3 "../$1" SA1.wav); done
2级
for d in ./*/ ; do (cd "$d" && python3 "../../$1" SA1.wav); done
对不起,如果这看起来微不足道。我还是新手。
其他信息:
这是我的完整目录路径:
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次。
答案 0 :(得分:0)
让我们来看看你的命令,wav.py为$ 1:
for d in ./*/ ; do (cd "$d" && python3 $1 SA1.wav); done
我们可以通过制作wav.py可执行文件并给它一个shebang来降低复杂性,以便您可以直接调用它吗?然后,您可以将其移动到PATH或临时将位置(位置)放入路径中。通常最好的习惯是,您的脚本不依赖于调用它的位置,尤其是它不需要位于调用它的同一目录中。
PATH=$PWD:$PATH
for d in ./*/ ; do (cd "$d" && wav.py SA1.wav); done
输入数据不应该依赖于相同的目录限制,因此您可以从每个目录调用它,并且数据也在任意目录中:
for d in ./*/ ; do wav.py $d/SA1.wav; done
你可能会生成一个输出文件,写入当前目录,然后你应该从输入目录中提取输出目录,如果这是你总想要实现的,或者让用户指定输出目录。默认的outputdir可能仍然是inputdir或当前目录。或者您写入STDOUT,并将输出传输到您选择的文件。
但你的全部命令是:
python3 $1 SA1.wav $2 SA2.wav $3
这对于简单的命令来说很好,但也许你可以用一种有意义的方式命名这些参数:
pyprog="$1"
samplerate="$2"
log="$3"
python3 $pyprog SA1.wav $samplerate SA2.wav $log
或者,如前所述
$pyprog SA1.wav "$samplerate" SA2.wav "$log"
然后,John1024s解决方案可能会起作用:
find . -type d -execdir $pyprog SA1.wav "$samplerate" SA2.wav "$log" ";"
如果不能选择更改pyprog,则有第二种方法可以解决问题:
编写一个包装器脚本,它将目录作为参数使用,并使用不同深度的目录对其进行测试。
然后通过find:
调用该包装器find . -type d -exec ./wrapper.sh {} ";"
wrapper.sh应该以:
开头#/bin/bash
#
#
directory="$1"
并在需要时使用它。
顺便说一下:我会将Python - WorkSpace
重命名为Python-WorkSpace
(甚至更好:python-workSpace
),因为文件和路径名中的空格总是会造成麻烦。