ディレクトリを再帰的に見つけてbashスクリプトからPythonスクリプト呼び出しに解析するにはどうすればよいですか?

ディレクトリを再帰的に見つけてbashスクリプトからPythonスクリプト呼び出しに解析するにはどうすればよいですか?

単一のディレクトリ内の複数のサブディレクトリを表示し、そのスクリプトpython内で呼び出されるスクリプトを使用して各サブディレクトリのファイルを表示しようとしています。bashgnu-parallel

スクリプトが取るパラメータは:(つまり、サブディレクトリ)と:(私が望むものと同じ)pythonです。 -ppath to files-ooutpath 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

あなたが達成したいのは、並列の内部 '変数' '{}'($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

これはただ保証します注文する出力は代わりに入力と同じです。働くその順序または決定的な順序で実行します。

おすすめ記事