如何递归查找目录并将它们解析为 bash 脚本中的 python 脚本调用?

如何递归查找目录并将它们解析为 bash 脚本中的 python 脚本调用?

我试图查看单个目录中的多个子目录,并使用我在该脚本python中调用的脚本绘制每个子目录中的文件。bashgnu-parallel

脚本采用的参数python-p: path to files(即子目录)和-o: outpath for plots(我希望与 相同-p)。

我有这个bash脚本:

#!/bin/bash

script="/path/to/python/script/plot.py"

files=($(find . -maxdepth 2 -mindepth 2 | sort))

pat=$files
out=$files
filt="True"
chan="Z"

parallel --jobs 4 python $script -f {} -p $pat -o $out -fl $filt -c $chan ::: ${files[@]}

但是,每个子目录中都没有绘图,并且脚本运行得非常快,因此我假设没有任何内容通过管道传输到patout参数中。我究竟做错了什么?谢谢!

答案1

我不认为 $pat 和 $out 具有您认为的值

$ echo ${files[@]}
./d1/file1 ./d1/file2 ./d1/file3 ./d2/file4 ./d2/file5 ./d2/file6
$ pat=$files
$ echo ${pat[@]}
./d1/file1
$ out=$files
$ echo ${pat[@]}
./d1/file1

我认为你想要完成的任务需要 $pat 和 $out 的不同值,具体取决于并行的内部“变量”'{}'(这将是 $files 数组的每个成员)的值,但是你已经get 只将 $files 的第一个成员放在命令行上。

GNU Parallel 支持的其他“变量”中,其中一个是“{//}”,它被“{}”值(如果有)的目录名称替换。

鉴于此,我认为你想要的东西更像

#!/bin/bash

script="/path/to/python/script/plot.py"

files=($(find . -maxdepth 2 -mindepth 2 | sort))

filt="True"
chan="Z"

parallel --jobs 4 python $script -f {} -p {//} -o {//} -fl $filt -c $chan ::: ${files[@]}

这更像你想要的吗?

$ parallel echo python $script -f {} -p {//} -o {//} -f $filt -c $chan ::: ${files[@]}
python /path/to/python/script/plot.py -f ./d1/file1 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file2 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file3 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file5 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file4 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file6 -p ./d2 -o ./d2 -f True -c Z

由于您在查找上使用排序,我认为您可能还想使用 --keep-order 参数:

$ parallel --keep-order echo python $script -f {} -p {//} -o {//} -f $filt -c $chan ::: ${files[@]}
python /path/to/python/script/plot.py -f ./d1/file1 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file2 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file3 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file4 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file5 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file6 -p ./d2 -o ./d2 -f True -c Z

这只能确保命令输出与输入相同,而不是工作以该顺序或任何确定性顺序运行。

相关内容