楽しい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から拡張子を取り除いたものになります。