我试图查看单个目录中的多个子目录,并使用我在该脚本python
中调用的脚本绘制每个子目录中的文件。bash
gnu-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[@]}
但是,每个子目录中都没有绘图,并且脚本运行得非常快,因此我假设没有任何内容通过管道传输到pat
或out
参数中。我究竟做错了什么?谢谢!
答案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
这只能确保命令输出与输入相同,而不是工作以该顺序或任何确定性顺序运行。