web-dev-qa-db-ja.com

find -exec cmd {} + vs | xargs

非常に大きなファイルのセットよりも効率的なのはどれですか?

find . -exec cmd {} +

または

find . | xargs cmd

(ファイル名に変な文字がないと仮定します)

111
dogbane

速度差はわずかです。

ただし、次のことを確認する必要があります。

  1. スクリプトは、ファイル名にスペースやタブなどが含まれないファイルを想定しません。最初のバージョンは安全ですが、2番目のバージョンは安全ではありません。

  2. スクリプトは、「_-_」で始まるファイルをオプションとして扱いません。

したがって、コードは次のようになります。

_find . -exec cmd -option1 -option2 -- {} +
_

または

_find . -print0 | xargs -0 cmd -option1 -option2 --
_

最初のバージョンは1を無視できるので短くて簡単ですが、2番目のバージョンは「= -exec cmd {} +_」がGNU findutilsの比較的新しいオプションであるため、よりポータブルで安全です(2005年以降、多くの実行中のシステムにはまだ搭載されていません)そして、最近は バグがありました 。ま​​た、多くの人はこの "_-exec cmd {} +_」、他の回答からわかるように。

103
Tometzky
find . | xargs cmd

より効率的です(cmdを1回実行するexecとは異なり、cmdはできる限り少ない回数実行します)。ただし、ファイル名にスペースやファンキーな文字が含まれていると、問題が発生します。

以下を使用することをお勧めします。

find . -print0 | xargs -0 cmd

ファイル名にファンキーな文字(-print0findにNULで終わるマッチを表示させます、-0xargsにこの形式を期待させます。)

8
ASk

最近のxargsのバージョンは、多くの場合、並列パイプライン実行をサポートしています。

明らかに、find … -execおよび… | xargs

2
poige