web-dev-qa-db-ja.com

検索が見つかったディレクトリに下がらないようにするにはどうすればよいですか?

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

だから私は時間を無駄にしたくありません./my-search-term/dir/my-search-termなど.

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

24
Stephen

-Pruneアクションは、findがディレクトリに再帰しないようにします。 -execなどの別のアクションと組み合わせることができます(-Pruneがどちらかの方法で実行される限り、-exec-Pruneの順序は重要ではありません)。

find . -name my-search-term -Prune -exec find {} … \;

findfind -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に完全に検索を停止させたい場合、最初に一致するディレクトリを見つけた後、探しているのはです。 -quit4.2.3のバージョンGNU find以降で使用可能)。これはfindをすぐに終了するため、使用するのが少し難しいです。したがって、-quitはコマンドの最後に配置する必要があります。

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

これが期待どおりに機能するためには、-exectrueを返すことを保証する必要があります(つまり、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」で結合されたすべての述語を括弧で囲んで評価するように強制できます。

6
rozcietrzewiacz

これがあなたが探しているものかどうかはわかりませんが、「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 ... ^ _ ^

0
FanDeLaU