その中に含まれているファイルを再検索できるように、特定の文字列を含むすべてのディレクトリを探したいと思います。
./my-search-term/dir/my-search-term
だから私はそのようなことに時間を無駄にしたくありません。
最初のmy-search-termディレクトリを探すときに再帰をどのように停止しますか?
答え1
タスク-prune
はfind
ディレクトリとして繰り返されません。たとえば、他のタスクと組み合わせることができます(-exec
どちらも実行される限り、順序は重要ではありません)。-prune
-exec
-prune
find . -name my-search-term -prune -exec find {} … \;
find
a 内部に入れ子にするのはfind -exec
少し問題になることがあります。ターミネータはexternalによってターミネータとして扱われるため、-exec
内部では使用できません。この問題はシェルを呼び出すことで解決できますが、引用するときは注意してください。find
find
find . -name my-search-term -prune -exec sh -c '
find "$@" … -exec … {\} +
' _ {} +
答え2
- ネイキッドソリューション -
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
これが期待どおりに機能するためには、返品を保証する必要が-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
最後の操作は、前の部分全体が返されなかった場合にのみ実行されます(例:)間違った。デフォルトでは、すべてのテストは論理「AND」で接続されます。この-o
オプションを使用すると、接続は「OR」に変更されます。
1つのトリッキーな要素は、コマンドを「最適化する」ことができ、-o
入力するだけでその部分を実行しない可能性があることです。find
-exec
find . -type d -name somename -exec ... -o -quit
この問題を解決するには、find
「OR」で連結されたすべての述語を括弧で囲んで強制的に評価できます。
答え3
これがあなたが探しているものであるかどうかはわかりませんが、 "maxlength"オプションはfindコマンドが現在のディレクトリから離れることを許可しません。また、クエリにワイルドカードを追加することもできると思います。
$> find /your/dir -name '*mystring*' -maxdepth 1 -type d -exec my_action {} \;
- 名前私の文字列「一致するファイルをすべて検索」私の文字列'。一重引用符に注意してください。 -maxlength 1 は現在のディレクトリ内のファイルを探します。 -maxlength 2 は、現在のディレクトリとは異なるレベルのディレクトリなどでファイルを検索します。 -type d は、ディレクトリに属するファイルを探します。 -type f 汎用ファイルなどを探します。
私の0.02...^_^