0

これは少し複雑ですが、find コマンドを使用してアイテム (ファイル、ディレクトリなど) を検索し、-exec パラメーターを介してそれらを含めるかどうかを決定するコマンドを実行したいのですが、 find が除外されたディレクトリに降りるのを防ぎます。

例えば:

find . -exec sh -c 'echo "{}" | grep -i ".*/[a][^/]*"' \;

少し奇妙な例ですが、基本的に上記は文字 a で始まる項目のみに一致するはずですが、実行すると、他の文字で始まるディレクトリと一致しなくても、 find はそれらに降りて結果を返しますそのディレクトリに文字 a で始まる項目が含まれている場合。たとえば、次のように一致します。

./aFolder/aFile
./Foo/Bar/aFile
./aFolder/Foo/Bar/aFile

私がしたいのは、ディレクトリが一致しない場合はその内容も無視されるように、これが起こらないようにすることです。最後の例では、./aFolder が一致しますが、./Foo が検出された場合は検索する必要があります。続行しないでください。

ディレクトリが除外されている場合に find がより深く降りないようにする方法、またはそのように制限できる同様のコマンドはありますか? 現在、カスタム シェル スクリプトを使用して自分で再帰を実行していますが、巨大なディレクトリ ツリーに対して最も効率的な方法ではありません。

4

1 に答える 1

1

これはあなたが望むことだと思います:

find . \( -name . -or -exec sh -c 'echo "{}" | grep -iq "^.*/[a][^/]*\$"' \; -or \( -prune -false \) \) -print

あなたからのいくつかの変更

  • -q を grep に追加し、-print を検索に追加して、出力が検索に一致するものであることを確認します。
  • 正規表現に ^ と $ を追加して、ファイル名全体がチェックされるようにします
  • -or ( -prune -false ) を追加して、一致しないアイテムが下位または一致しないようにします (-prune のみが true です)。
  • 最後に、 -name を追加します。そうしないと、トップレベルのディレクトリが失敗し、正しくは何も返されません
于 2013-04-30T22:53:26.850 に答える