ディレクトリツリー内のすべてのファイルに対してコマンドを実行する最良の方法

ディレクトリツリー内のすべてのファイルに対してコマンドを実行する最良の方法

これを行う方法には、ループ、検索、およびシェルスクリプトのxargsを含むいくつかの方法があります。このうちどれが一番良く、どれが一番持ち運びがいいですか?

答え1

find . -exec <command> {} \;

現在のディレクトリがツリーのルートであるか、通常は次のようになります。

find <directory> -exec <command> {} \;

答え2

ファイルまたはディレクトリ名にスペースが含まれている場合は、-print0検索オプションとターゲット-0オプションを使用してください。xargs

find {dir} -print0 | xargs -0r {command}

findオプションは、-print0ファイル名をNULスペースで区切られたリストではなく--separatedリストとして印刷し、スペースではなくスペースで-0入力を中断するように指示しますxargs。 Unixファイル名に許可されていない文字の1つNULなので、NULファイル名の一部として誤解することは不可能です。

オプション-rがあるため、xargs入力しなくてもエラーは発生しません。

答え3

移植性が問題であれば、シェル専用のアプローチを避けます。 (さまざまなシェルを使用している人が多いですが、通常、findとxargsは誰もがあまりにも根本的な方法で変更できない非常に基本的なツールです。)

find と xargs でデフォルトの引数を使用すると、より移植可能なソリューションが提供されます。

答え4

使用しているコマンドのバージョンに再帰操作のフラグがまだないことを確認してください。 :)

関連情報