しおメモ

雑多な技術系ブログです。ニッチな内容が多いです。

xargsの-Pオプションでコマンドを並列実行する

シェルだけで簡単にコマンドを並列実行するのに、xargs-Pオプションがあります。
GNU Parallelも便利ですが、そちらはmacユーザーだと別途インストールが必要なので、こちらを紹介します。


使い方

xargs -Pn

-Pで並列実行の最大のプロセス数を指定します。
GNU版の場合、-P0で自動で最大限のプロセスを指定してくれますが、macなどBSD版の場合、n>0の制約がついています。

活用例

例1. 一括画像リサイズ

find . -type f -name "*.jpg" | xargs -I@ -P8 convert -resize 100x100 @ @

Imagemagickと組み合わせて、画像を一括リサイズします。

例2. 連番ダミー画像生成

seq 1 100 | xargs -I@ -P8 convert -size 600x600 -pointsize 150 -gravity Center label:No.@ @.jpg

またImagemagickの例になってしまうのですが、大量に画像を生成する時なども効率的です。

例3. 動画の変換

find . -type f -name "*.MOV" | xargs -I@ -P8 ffmpeg -i @ -vf scale=320:-1 -r 15 @.gif

ffmpegとも相性がいいです。

おわりに

簡単な画像処理などは、Photoshopバッチ処理や、Pythonなどで書くよりも断然楽をできると思います。
その他、wgetcurl等と組み合わせて、画像のクローリングなどにも使用できますが、サーバーに負荷がかかってしまうので、その場合はプロセスを増やしすぎるのはお勧めできません。