非常に大きなファイルのセットよりも効率的なのはどれですか?
find . -exec cmd {} +
または
find . | xargs cmd
(ファイル名に変な文字がないと仮定します)
速度差はわずかです。
ただし、次のことを確認する必要があります。
スクリプトは、ファイル名にスペースやタブなどが含まれないファイルを想定しません。最初のバージョンは安全ですが、2番目のバージョンは安全ではありません。
スクリプトは、「_-
_」で始まるファイルをオプションとして扱いません。
したがって、コードは次のようになります。
_find . -exec cmd -option1 -option2 -- {} +
_
または
_find . -print0 | xargs -0 cmd -option1 -option2 --
_
最初のバージョンは1を無視できるので短くて簡単ですが、2番目のバージョンは「= -exec cmd {} +
_」がGNU findutilsの比較的新しいオプションであるため、よりポータブルで安全です(2005年以降、多くの実行中のシステムにはまだ搭載されていません)そして、最近は バグがありました 。また、多くの人はこの "_-exec cmd {} +
_」、他の回答からわかるように。
find . | xargs cmd
より効率的です(cmd
を1回実行するexec
とは異なり、cmd
はできる限り少ない回数実行します)。ただし、ファイル名にスペースやファンキーな文字が含まれていると、問題が発生します。
以下を使用することをお勧めします。
find . -print0 | xargs -0 cmd
ファイル名にファンキーな文字(-print0
はfind
にNULで終わるマッチを表示させます、-0
はxargs
にこの形式を期待させます。)
最近のxargs
のバージョンは、多くの場合、並列パイプライン実行をサポートしています。
明らかに、find … -exec
および… | xargs