特定の文字列を持つすべてのディレクトリを検索したいので、その中に含まれるファイルで別の検索を実行できます。
ですから、時間を無駄にしたくありません./my-search-term/dir/my-search-term。
最初のmy-search-termディレクトリが見つかったときに再帰を停止するにはどうすればよいですか?
特定の文字列を持つすべてのディレクトリを検索したいので、その中に含まれるファイルで別の検索を実行できます。
ですから、時間を無駄にしたくありません./my-search-term/dir/my-search-term。
最初のmy-search-termディレクトリが見つかったときに再帰を停止するにはどうすればよいですか?
回答:
この-pruneアクションはfind、ディレクトリを再帰しません。-exec次のような別のアクションと組み合わせることができます(どちらの方法で実行される限り、順序は重要では-pruneあり-execません-prune)。
find . -name my-search-term -prune -exec find {} … \;
のfind内部でのネストfind -execは少し問題になることに注意してください:ターミネーターはアウターによってターミネーターと見なされるため、-execインナーfindでは使用できませんfind。シェルを呼び出すことでそれを回避できますが、引用には注意してください。
find . -name my-search-term -prune -exec sh -c '
find "$@" … -exec … {\} +
' _ {} +
-pruneはtrueを返し、の前に置くことができます-exec。
-oそこにいる習慣があると思います。-prune前に置く-exec方が読みやすいと思います。
-prune以前はこのオプションを使用していませんでした。
mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;エラーが発生します:find: ./x1: No such file or directory。解決策は-prune、findコマンドの最後に追加することです。
find展開{}し-execます。このようなバージョンはfind、2番目のコマンドで停止します。これは{}、内部findコマンド(シェルコマンド)が、outerで見つかったディレクトリの名前に置き換えられるためfindです。find . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \; つまり、"{"}シェルをに変換するを使用して、これを修正できます{}。…(続き)
find見つかったディレクトリのコンテンツをスキップしたいが、他のディレクトリで検索を続けたい場合は-prune、@ laebshadeの提案どおりに使用してください。完全なコマンドは次のようになります。
find . -type d -name somename -prune -exec ...
あなたがしたい場合一方、find完全にするために検索を停止し、最初に一致したディレクトリを発見した後、その後、あなたが探していることである-quit(バージョン以降で利用可能4.2.3にGNU find)。これは、findすぐに終了するため、使用するのが少し難しくなります。-quitコマンドの最後に配置する必要があります。
find . -type d -name somename -exec ... -quit
これが予想どおりに機能するためには、trueが-exec返されること(つまり、ゼロステータス)を保証する必要があります。の終了ステータスを-exec無視したい場合、-quit常に機能するようにするには、ちょっとしたトリックが必要です。
find . -type d -name somename \( -exec ... -o -true \) -quit
または
find . -type d -name somename \( -exec ... -o -quit \)
または
find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit
find動作方法に関する最も重要なことは、すべてのアクション(「テスト」)が左から右に解釈される論理述語として扱われることです。したがって、最後のアクション(たとえば-quit)は、前の部分全体がfalseを返さなかった場合にのみ実行されます。デフォルトでは、すべてのテストは論理「AND」で-o結合され、オプションは結合を「OR」に変更します。
トリッキーな要素は-oつまりfind缶「最適化」あなたのコマンドと実行しないで-execあなただけ入力した場合の部分を
find . -type d -name somename -exec ... -o -quit
これに対処するために、find括弧で囲むことにより、「OR」で結合されたすべての述部を強制的に評価できます。