繁体   English   中英

Bash-目录相关的脚本

[英]Bash - Directory dependent script

我试图在目录中运行python脚本,然后使用bash将此脚本应用于其每个子目录。

我发现,做它1组子目录UNIX堆叠交换的脚本在这里 但我希望它对所有子目录都递归起作用

问题是我在父目录中只有一个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次此错误。

让我们看一下您的命令,其中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或当前dir。 或者,您写入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 . -type d -exec ./wrapper.sh {} ";"

wrapper.sh应该以以下内容开头:

#/bin/bash
#
#
directory="$1" 

并在需要的地方使用它。

顺便说一句:我也将Python - WorkSpace重命名为Python-WorkSpace (甚至更好: python-workSpace ),因为文件名和路径名中的空格总是会引起麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM