GNU parallel は、 Linuxやその他のUnix 系オペレーティングシステム用のコマンドラインユーティリティで、ユーザーがシェルスクリプトやコマンドを並列実行できるようにします。GNU parallel はフリーソフトウェアで、Ole Tange がPerlで作成しました。GPLv3の条件で利用可能です。[ 2 ]
最も一般的な使用法は、シェルループを置き換えることです。
while read x ; do_something " $ x " done < listの形で
並列処理する<リスト ファイルlistには引数が含まれておりdo_something、process_output空でも構いません。
parallel を使用するスクリプトは、 pexecを使用するスクリプトよりも読みやすい場合が多い。
プログラムの並列機能も
デフォルトでは、parallel はCPU コアの数と同じ数のジョブを並列実行します。
find . -name "*.foo" | parallel grep bar 上記は、以下の並列処理に相当するものです。
find . -name "*.foo" -exec grep bar {} + これは、現在のディレクトリとそのサブディレクトリにある、名前がで終わるすべてのファイルの中から、文字列.fooの出現箇所を検索します。ファイル名に改行が含まれていない限り、並列コマンドは期待どおりに動作します。この制限を回避するには、以下を使用できます。bar
find . -name "*.foo" -print0 | parallel -0 grep bar 上記のコマンドは、ファイル名を区切るためにヌル文字を使用しています。
find . -name "*.foo" | parallel -X mv {} /tmp/trash 上記のコマンドは、{}コマンドラインの長さが許す限り多くの引数を追加し、必要に応じて並列ジョブ間で均等に分散します。これにより、起動時間よりも完了時間が短い短時間コマンドの処理オーバーヘッドを削減できます。
find . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media 上記のコマンドは、以下のコマンドと同じ動作をします。
cp -v -p *.ogg /home/media findしかし、 / parallel/を使用する前者のコマンドはcpリソース効率が良く、*.ogg の展開がシェルにとって大きすぎる場合でもエラーで停止しません。