うまいぼうぶろぐ

linuxとhttpdとperlのメモ

find -execとxargs

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

追記

find の-delete option はOSによっては使えなかったと思います。linuxとMax OS X は使用可能。たしかSolaris はダメだったような。。。