ファイルパスである単一の引数を受け入れるコマンドがあるとしましょう。
mycommand myfile.txt
ここで、このコマンドを複数のファイルに対して並行して実行したいと思います。具体的には、ファイルマッチングパターンmyfile*
。
これを達成する簡単な方法はありますか?
GNU xargs
と、プロセス置換をサポートするシェルを使用
_xargs -r -0 -P4 -n1 -a <(printf '%s\0' myfile*) mycommand
_
最大4mycommand
sを並行して実行します。
mycommand
がそのstdinを使用しない場合は、次のこともできます。
_printf '%s\0' myfile* | xargs -r -0 -P4 -n1 mycommand
_
これは、最新のBSDのxargs
でも機能します。
_myfile*
_ファイルを再帰的に検索するには、printf
コマンドを次のように置き換えます。
_find . -name 'myfile*' -type f -print0
_
(_-type f
_は通常のファイル専用です。globと同等の場合は、zsh
とそのprintf '%s\0' myfile*(.)
が必要です)。
GNU Parallelを使用すると、次のようになります。
parallel mycommand ::: myfile*
コアごとに1つのジョブを実行します。
GNU Parallelは一般的な並列処理機能であり、同じマシン上またはsshアクセスできる複数のマシン上でジョブを簡単に並列実行できます。多くの場合、for
ループを置き換えることができます。
4つのCPUで実行する32の異なるジョブがある場合、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallelは、終了時に新しいプロセスを生成します。つまり、CPUをアクティブに保ち、時間を節約します。
インストール
GNU Parallelがディストリビューション用にパッケージ化されていない場合は、rootアクセスを必要としない個人インストールを実行できます。これを行うことで10秒で実行できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、 http://git.savannah.gnu.org/cgit/parallel.git/tree/README を参照してください。
詳細
その他の例を参照してください: http://www.gnu.org/software/parallel/man.html
イントロビデオを見る: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
チュートリアルをウォークスルーします: http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるためにメーリングリストにサインアップしてください: https://lists.gnu.org/mailman/listinfo/parallel