GNU parallel
作者 | Ole Tange[1] |
---|---|
開発元 | GNUプロジェクト |
最新版 |
20240222 ('Навальный')
/ 2024年2月28日[2] |
リポジトリ | |
プログラミング 言語 | Perl |
対応OS | Unix系 |
サポート状況 | 開発中 |
種別 | ユーティリティ |
ライセンス | GNU GPL v3+[1] |
公式サイト | GNU Parallel |
GNU parallel (グヌー・パラレル) は、Unix系OSのコマンドラインユーティリティである。Unixシェル上でコマンドの並列実行を可能にする[1]。Ole Tange によってPerl言語で作られ、GNU GPL v3+の下で配布されている[1]。
使用方法
[編集]最も一般的な使用方法は、sh
スクリプトの for
の置き換えであり、以下はその例である。
for x in $(cat list) ; do
do_something "${x}"
done | process_output
このコマンドは以下のように置き換えることができる。
cat list | parallel do_something | process_output
do_something
の引数となるファイルの一覧 (list
) は、パイプによって入力される。また、process_output
が空の場合がある。
GNU parallel を使用するスクリプトは、pexecを使用するスクリプトよりも可読性が高いものになる。
GNU parallel では、以下のような処理が行われる。
- 並列実行しているジョブの出力が実行されること防ぐために、標準出力と標準エラー出力のグループ化。
- 出力先の順序を入力元の順序と同じ順序にする。
- スペース・引用符・アンパサンド・UTF-8でエンコードされた文字などの特殊文字を適正に処理。
デフォルトでは、CPUのコア数と同数のジョブが並列実行される。
実行例
[編集]find . -name "*.foo" | parallel grep bar
上記のコマンドは以下のコマンドと同等である。
find . -name "*.foo" -exec grep bar {} +
これらのコマンドは、カレントディレクトリとそれ以下に存在する全てのファイルとディレクトリで名前が『.foo
』で終わるものを検索し、その中で名前に『bar
』を含むものを更に検索するものである。parallel
は、ファイル名に改行が含まれていない限りは正常に動作する。ファイル名に改行が含まれている場合は以下のコマンドによって問題を回避する。
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
』に一致するファイルが膨大な場合に発生するシェルへの過負荷によるエラーを防ぐことができる。
脚注
[編集]- ^ a b c d “GNU Parallel”. Free Software Foundation. 2018年9月27日閲覧。
- ^ Tange, Ole (28 February 2024). "GNU Parallel 20240222 ('Навальный') released [stable]". parallel (Mailing list). 2024年3月11日閲覧。