2010-04-10
findコマンドの-execで複数ファイルを扱うときは「-exec utility {} +」を使うのもオススメ
このめっちゃ便利やねん find コマンドのオプションまとめ | バシャログ。のエントリーを読んで反応。
3年前にvoid GraphicWizardsLair( void ); // いまどきfindとxargsを使う時は-print0と-0を忘れずにで「-print0オプションを付けて、xargs -0で受け取る」という話題を書いたけど。
同じようなテクニックとして
find . -name 'hoge' -exec chown USERID {} +
という風に「\;」じゃなくて「+」で終端させるという方法もある。
-exec utility [argument ...] {} +
-exec と同じですが、各 utility の起動において ``{}'' はなるべく多くのパス名と置き換えられます。この動作は xargs(1) のものに似ています。
ということ。
ちなみにディレクトリ名やファイル名がMac OS Xのように空白を含んでいてもデリミタとして誤爆することはない。(つまり-print0 | xargs -0と同様の動作)
「-exec utility {} +」と「-print 0 | xargs -0 utility」の違いは
シェルスクリプト総合 その15から引用すると
- exec + のデメリット
コマンドに渡すファイルの数を制御できない(xargs -n)
並列実行できない(xargs -P)
- exec + のメリット
find でひっかかったファイルが存在しなければコマンドが実行されない
(GNU xargs は入力がゼロでもなぜか1回は実行する; xargs -r で抑制可)
コメント
トラックバック - http://subtech.g.hatena.ne.jp/otsune/20100410
