特定の文字列を持つすべてのディレクトリを検索したいので、その中に含まれるファイルで別の検索を実行できます。
ですから、時間を無駄にしたくありません./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」で結合されたすべての述部を強制的に評価できます。