検索でディレクトリを適切に除外するにはどうすればよいですか?

検索でディレクトリを適切に除外するにはどうすればよいですか?

この質問によると:検索でディレクトリを除外する方法コマンドは次のようになります:

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

でももし私が

find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print

つまり、次のようになります。 find: paths must precede expression: ./.cache'

find: possible unquoted pattern after predicate -o'?

しかし、私は引用しました。

また、-pathオプションの後のパスは絶対パスにすべきでしょうか、それとも相対パスにすべきでしょうか? 現在の dir を含めましたが./[somefile]、それは必要ですか-path?

答え1

-path最後のオプション値の前の述語を忘れました"./.cache"

で使用されるパスは、-pathで使用されるトップレベルの検索パスから始まる必要がありますfind。たとえば、

  • find . -path './something/here'
  • find /etc -path '/etc/init.d'

ファイルシステムツリー内の位置を指定せずにディレクトリ名を一致させたい場合には、ワイルドカードを使用する必要があるかもしれません。この例では、ディレクトリの下にあるすべてのファイル( )*と一致します。-type fwizard

  • find . -path '*/wizard/* -type f -print

答え2

将来の読者のために、POSIX準拠のソリューション除外されたディレクトリを走査せず、出力に含めない一般的な形式は次のとおりです。

単独除外

find searchpath \! \( -path searchpath/excludepath -prune \)

複数の除外

find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)

そのトラバーサルを防ぐことで、巨大なこれらのディレクトリに多くのファイルが含まれている場合のパフォーマンスが向上します。出力から除外されたディレクトリを完全に省略することで、意図しない操作を防止します。

さらにフィルターや出力パラメータを配置できる表示されているものすべて、ただし などの-maxdepth直後に常に配置されるものを除くsearchpath。 の引数はそのディレクトリの出力-pathと一致する必要がありfind、ワイルドカードはエスケープ/引用符で囲む必要があります。


この問題の場合、解決策は次のようになります (-printはデフォルトであるため)。

find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)

答え3

findコマンドで複数のディレクトリを除外する方法を探していたら、このページにたどり着きました。ウォルフ最もエレガントです。私の実験では、同じコンセプトに基づいたバリエーションは次のようになります。

find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print

関連情報