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


回答:


13
find . -exec <command> {} \;

現在のディレクトリをツリーのルートとして、または一般的に:

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

4
一部のシステムでは、findを使用できる-execオプションがありません。| xargs <コマンド>
ヘマント

4
確かに、何かでフィルタリングする必要がある場合は-name "*.c"、たとえば-type dディレクトリを試してください

Findは驚くほど複雑なことを行うことができます- 完全なオプションリストについては、manページ-unixhelp.ed.ac.uk/CGI/man-cgi?find-を確認してください。
ルーカスジョーンズ

また、スペースを含むファイル名に注意してください。これにより、-execおよびxargsのアプローチが崩れる可能性があります。tinyurl.com/ygvgmw5
ショーンチン

可能であれば、find ... | xargs ...イディオムを使用して、バッチでファイルを処理します。これにより、通常はより高速になります(プロセスの起動が少なくなります)。
フォンブランド

5

使用する-print0検索するオプションと-0するためのオプションをxargs使用すると、スペースを含むファイルやディレクトリの名前を持っている場合:

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

-print0ファイル名からプリントを見つけるためのオプションNULながらではなく、空白で区切らよりは、リストを分離-0するオプションxargsを指示は、それがその入力破るためにNULではなく、空白を。以来NUL、Unixのファイル名に許可されていない文字の一つであり、それはファイル名の一部と誤解されるように方法はありません。

-rオプションは、そのように存在しxargs、それは何の入力を持っていない場合にエラーを与えることはありません。


3

移植性が問題になる場合は、シェル固有の方法を避けます(多くの異なるシェルを使用する人は大勢いますが、一般にfindとxargsは根本的なツールであり、誰も急進的に変更することはありません) 。

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


2

引数をグループ化することが許容される場合、xargsは、find -execよりもコマンドの実行回数がはるかに少ないため、おそらくパフォーマンスが向上します。各ファイルに対してコマンドを毎回実行する場合、またはファイルのサブディレクトリで実行する場合は、おそらくfind -execまたは-execdirを使用する必要があります。

原則として、シェル固有のループから離れることが望ましいです。ほとんどのシナリオでは、find&xargsで十分です。


1

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


0
find [args] -print | xargs {command}

私に最適です。


2
-1スペースを含むファイル名では機能しません。find -print0をより適切に使用する| xargs -0。
スターブルー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.