GNU parallel

GNU parallel (グヌー・パラレル) は、Unix系OSのコマンドラインユーティリティである。Unixシェル上でコマンドの並列実行を可能にする。
GNU parallelはOle TangeによってPerlで書かれ、GNU GPL v3+の下で配布されている。
使用方法.
最も一般的な使用方法は、シェルスクリプトのfor文の置き換えであり、以下はその例である。
for x in $(cat list) ; do
 do_something "${x}"
done | process_output
このコマンドは以下のように置き換えることができる。
cat list | parallel do_something | process_output
codice_1の引数となるファイルの一覧 (codice_2) は、パイプによって入力される。また、codice_3が空の場合がある。
GNU parallelを使用するスクリプトは、を使用するスクリプトよりも可読性が高いものになる。
GNU parallelでは、以下のような処理が行われる。
デフォルトでは、CPUのコア数と同数のジョブが並列実行される。
実行例.
find . -name "*.foo" | parallel grep bar
上記のコマンドは以下のコマンドと同等である。
find . -name "*.foo" -exec grep bar {} +
これらのコマンドは、カレントディレクトリとサブディレクトリの名前が『.foo』で終わる全てのファイルとディレクトリを検索し、その中で名前に『bar』を含むものを更に検索するものである。codice_4は、ファイル名に改行が含まれていない限りは正常に動作する。ファイル名に改行が含まれている場合は以下のコマンドによって問題を回避する。
find . -name "*.foo" -print0 | parallel -0 grep bar
上記のコマンドは、ヌル文字によってファイル名を区切っている。
find . -name "*.foo" | parallel -X mv {} /tmp/trash
上記のコマンドは、引数の位置をcodice_5によって変更している。
find . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media
上記のコマンドは以下のコマンドと同等である。
cp -v -p *.ogg /home/media
上記のコマンドよりもcodice_6とcodice_4とcodice_8を使用している実行例の方がリソース効率がよく、『*.ogg』に一致するファイルが膨大な場合に発生するシェルへの過負荷によるエラーを防ぐことができる。