楽しいGNU Parallel

スクリプト言語で書いた処理を合計で5ギガバイトくらいあるHTMLファイル群に適用したい。数時間なら待っても良いが,数日かかるのは困る」という時に役立ちました。

find input -name "*.html" | parallel --dry-run --progress --joblog /tmp/parallel.log "python awesome_script.py < {} > output/{/.}.txt"

find input -name "*.html"ではなくls -1 input/*.htmlみたいなのでも良いのではないかと思ってしまう人もいるかもしれませんが,コマンドに渡せる引数の長さには上限があります。数万ファイルという規模になると*を展開したときに上限に引っかかるのでls -1 input/*.htmlは使えません.(参考 xargs コマンド | コマンドの使い方(Linux) | hydroculのメモ)

--dry-runというオプションを付けると,実行は行わずにどのようなコマンドが実行されるかを見ることができます。コマンドが合っていることを確かめられたら--dry-runを外して実行します。

--progressを付けると,今どれくらいのジョブが終了したか分かります。--bar--etaでも良さそう。

--joblogを付けるとログを出力します。--resumeするのに必要らしい。

実行するコマンドを書くところでは,{}を指定すると処理しようとしているファイルの名前が入ります。{/}を指定すればファイル名のbasename,{.}を指定すればファイル名から拡張子を取り除いたもの,{/.}を指定すればファイル名のbasenameから拡張子を取り除いたものになります。

有益なリンク