検出されたディレクトリへの検索の下降を停止するにはどうすればよいですか?


24

特定の文字列を持つすべてのディレクトリを検索したいので、その中に含まれるファイルで別の検索を実行できます。

ですから、時間を無駄にしたくありません./my-search-term/dir/my-search-term

最初のmy-search-termディレクトリが見つかったときに再帰を停止するにはどうすればよいですか?


3
-pruneでfindを試みましたか?マニュアルページから:「ファイルがディレクトリの場合、そのディレクトリに下がらないでください。-depthが指定されている場合はfalse。効果はありません。
レブシェード

1
@laebshade答えに入れてみませんか?
jw013

@ jw013その時点で、より詳細な回答を提供する時間がありませんでした。
laebshade

回答:


17

この-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 … {\} +
' _ {} +

最初のコマンドの括弧は必要ですか?-prunetrueを返し、の前に置くことができます-exec
rozcietrzewiacz

@rozcietrzewiaczいいえ、必要ありません。-oそこにいる習慣があると思います。-prune前に置く-exec方が読みやすいと思います。
ジル「SO-悪であるのをやめる」

おかげで、-prune以前はこのオプションを使用していませんでした。
haridsv

私のユースケースでは、このコマンド: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。解決策は-prunefindコマンドの最後に追加することです。
haridsv

(1)の一部のバージョンは、の引数の部分文字列として表示される場合でもfind展開{}-execます。このようなバージョンはfind、2番目のコマンドで停止します。これは{}、内部findコマンド(シェルコマンド)が、outerで見つかったディレクトリの名前に置き換えられるためfindです。find . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \; つまり、"{"}シェルをに変換するを使用して、これを修正できます{}。…(続き)
スコット

6

-ベアソリューション-

find見つかったディレクトリのコンテンツをスキップしたいが、他のディレクトリで検索を続けたい場合は-prune、@ laebshadeの提案どおりに使用してください。完全なコマンドは次のようになります。

 find . -type d -name somename -prune -exec ...

あなたがしたい場合一方、find完全にするために検索を停止し、最初に一致したディレクトリを発見した後、その後、あなたが探していることである-quit(バージョン以降で利用可能4.2.3GNU 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」で結合されたすべての述部を強制的に評価できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.