xargs -P が激しく便利なのでメモ

xargs の -P オプションを使うとプロセスを複数起動して処理を並列に行なうことが出来る。

例えば、 1 万枚の JPEG 画像を全て 800x800 に収まるように効率良くリサイズしたい。
まず私はこのようなコマンドを考えた。

convert --geometry 800x800 *.jpg

しかし zsh に怒られた。

zsh: argument list too long: convert

引数が全て展開されるためこのような事が起きる。
私は xargs を使って処理することを思い付いた。

ls | xargs -I{} convert --geometry 800x800 {} c_{}

処理は行なわれるが非常に遅い。
しかも CPU を全く使っていないことが分かり、私は処理を並列的に行なう事を考えた。

そこで xargs の -P オプションの出番である。 P の後に並列起動したいプロセスの個数を書く。
私は 8 と書いたが、この値は並列実行するコマンドの処理内容やストレージの速度、 CPU のコア数と要相談だと思うので各々調整してほしい。

ls | xargs -P8 -I{} convert --geometry 800x800 {} c_{}

あなたがもし処理が正常に行なわれているか不安ならば、 -t と -n1 オプションも付けると良い。
これで処理が高速に行なわれることを見守る事ができる。

ls | xargs -P8 -t -n1 -I{} convert {} --geometry 800x800 c_{}

-P オプションを使ったコマンドを発行するとたちまち全てのコアの使用率が 100% となり、凄い勢いで画像のリサイズが行なわれる。大変便利。

追記

  • 11/23
    • ls -1 は ls で良かったので修正