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

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

これを行うには、シェル スクリプト、find、xargs でのループなど、いくつかの方法があるようです。これらのうちどれが最適で、どれが最も移植性が高いでしょうか?

答え1

find . -exec <command> {} \;

現在のディレクトリをツリーのルートとして使用する場合、または一般には:

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

答え2

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

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

find のオプション-print0は、ファイル名NULを空白で区切られたリストではなく、 で区切られたリストとして出力します。一方、 の-0オプションはxargs、入力をNUL空白ではなく で区切るように指示します。NULは Unix ファイル名で許可されていない文字の 1 つであるため、ファイル名の一部と間違われることはありません。

このオプションは、入力がない場合にエラーが発生しない-rようにするためのものです。xargs

答え3

移植性が問題になる場合は、シェル固有の方法は避けます (さまざまなシェルを使用している人はたくさんいますが、一般的に find と xargs は、誰も根本的に変更しようとしない、本当に基本的なツールです)。

find と xargs の基本引数を使用すると、より移植性の高いソリューションが得られます。

答え4

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

関連情報