Bash - 目录依赖脚本

时间:2018-03-11 23:01:35

标签: bash directory

我正在尝试在目录中运行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次。

1 个答案:

答案 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),因为文件和路径名中的空格总是会造成麻烦。