find -execは、1ファイルに対して1回ずつコマンドを実行。xargsは標準入力から受け取った複数のファイルに対して、コマンドを1回で実行(といってもシェルに渡せる限界があるから、入力が多すぎる場合は複数回にわけて実行)。だから、xargsのほうが早いと思っていた。例えば特定のファイルを消す場合。
$ find /tmp/ -type f -mtime +1 -exec rm {} \; # 以下とほぼ同等 $ find /tmp/ -type f -mtime +1 -print0 | xargs -0 -n1 rm
ところが、find -execで'\;'ではなく、'+'を指定すればxargsと同じように、複数ファイルに対してコマンド実行するらしい。
これはすべての単一ファイルに対して一回ずつ rm を呼んでいる。しかし、最近の find では xargs を使った方法と同じことができる。
$ find /tmp/ -type f -mtime +1 -exec rm {} +
書いてて思ったけど、ファイル削除するだけなら-deleteでいいのだった。
$ find /tmp/ -type f -mtime +1 -delete