特定の文字列を含むすべてのディレクトリを検索したいので、その中に含まれるファイルで別の検索を実行できます。
だから私は時間を無駄にしたくありません./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
内にネストすることは少し問題になる可能性があることに注意してください。内側のfind
で-exec
を使用することはできません。外側のfind
によるターミネータ。シェルを呼び出すことで回避できますが、引用には注意してください。
find . -name my-search-term -Prune -exec sh -c '
find "$@" … -exec … {\} +
' _ {} +
見つかったディレクトリの内容をfind
でスキップし、他のディレクトリで検索を続ける場合は、@ laebshadeが示唆するように-Prune
を使用します。完全なコマンドは次のようになります
find . -type d -name somename -Prune -exec ...
一方、find
に完全に検索を停止させたい場合、最初に一致するディレクトリを見つけた後、探しているのはです。 -quit
(4.2.3
のバージョンGNU find
以降で使用可能)。これはfind
をすぐに終了するため、使用するのが少し難しいです。したがって、-quit
はコマンドの最後に配置する必要があります。
find . -type d -name somename -exec ... -quit
これが期待どおりに機能するためには、-exec
がtrueを返すことを保証する必要があります(つまり、zerostatus)。 -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
がどのように機能するかについて最も重要なことは、すべてのアクション( "tests")がとして扱われることです論理述語は左から右に解釈されます。したがって、最後のアクション(たとえば、-quit
)は、前の部分全体がfalseを返さなかった場合にのみ実行されます。デフォルトでは、すべてのテストは論理「AND」で結合され、-o
オプションは結合を「OR」に変更します。
-o
のトリッキーな要素は、find
がコマンドを「最適化」し、単に-exec
部分を実行しないと、
find . -type d -name somename -exec ... -o -quit
これに対処するには、find
に「OR」で結合されたすべての述語を括弧で囲んで評価するように強制できます。
これがあなたが探しているものかどうかはわかりませんが、「maxdepth」オプションでは、findコマンドが現在のディレクトリを超えることができません。また、検索にワイルドカードを追加できると思います。
$> find /your/dir -name '*mystring*' -maxdepth 1 -type d -exec my_action {} \;
-name 'mystring'は、 'mystring'に一致するすべてのファイルを検索します。一重引用符を気にしてください。 -maxdepth 1は、現在のディレクトリを通過しないファイルを検索します。 -maxdepth 2は、現在のディレクトリおよび1つ以上のレベルのディレクトリなどにあるファイルを検索します。 -type dは、ディレクトリであるファイルを検索します。 -type fは、通常のファイルなどを検索します。
私の0.02 ... ^ _ ^