この質問によると:検索でディレクトリを除外する方法コマンドは次のようになります:
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 f
wizard
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