xargsのオプション

コマンドの実行結果から、他のコマンドを実行したいというのはUnix / Linux系のOSでは良くあることだと思います。

そんなときパイプを使ったり、xargsを使ったりして処理すると思うのですが、例えばディレクトリ内の30日以上経過したファイルを一括で消したいという時には

find . -mtime +30 -print | xargs rm

とか

find . -mtime +30 -exec rm {}¥;

とかして、実施すると思います。でも、例えば対象ファイルをgzip圧縮したいという場合だと、上記の方法をそのまま

find . -mtime +30 -print | xargs gzip

とか

find . -mtime +30 -exec gzip {}¥;

のように実行してしまうと、1ファイル毎に圧縮するので圧縮するためのプロセスが1つしか同時に起動していないので、最近のマルチコアのCPUを使っても処理速度が遅かったりします。こういう場合にxargsのオプションを使うと同時に複数のgzipを起動出来る事が判りました。xargsのオプションに-Pというのがあって、コマンドを同時に複数発行してくれる。manを読むとParallel mode: run at most maxprocs invocations of utility at once.とか書いてあって、目から鱗です。

例えば、上の例だと

find . -mtime +30 | xargs -P 4 gzip

と実行すると、あら不思議。同時にgzipが4つ起動するじゃありませんか。その時gzip毎に別のプロセスが起動するので当然のことながら、CPUの別のコアを使って処理されたりします。


ちょっとだけ速く処理できるという事で、便利、便利。