単一のディレクトリ内の複数のサブディレクトリを表示し、そのスクリプト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
あなたが達成したいのは、並列の内部 '変数' '{}'($files配列の各メンバーになるでしょう)の値に応じて$ patと$ outに対して異なる値が必要だと思いますが、Placeを得ました。コマンドラインには $files の最初のメンバーのみが表示されます。
GNU Parallelでサポートされている他の「変数」の1つは「{//}」であり、これは「{}」値(存在する場合)があるディレクトリ名に置き換えられます。
これを考えると、次のようなことがもっと欲しいと思います。
#!/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
これはただ保証します注文する出力は代わりに入力と同じです。働くその順序または決定的な順序で実行します。