-prune
の場合 うまくいかない場合は、次のようになります:
find -name "*.js" -not -path "./directory/*"
注意: 不要なディレクトリをすべてトラバースする必要があります。
-prune
を使用 主要な。たとえば、./misc
を除外する場合 :
find . -path ./misc -prune -o -name '*.txt' -print
複数のディレクトリを除外するには、OR を括弧で囲みます。
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
また、任意のレベルで特定の名前のディレクトリを除外するには、 -name
を使用します -path
の代わりにプライマリ .
find . -type d -name node_modules -prune -o -name '*.json' -print
以下は、他の提案された解決策よりも簡単に推論できると思います:
find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
重要な注意: -path
の後に入力するパス find
と正確に一致する必要があります 除外なしで印刷されます。この文が混乱している場合は、全体 に完全なパスを使用してください。 次のようなコマンド:find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
.理解を深めたい場合は、注 [1] を参照してください。
\(
内 そして \)
正確に一致する表現です build/external
(上記の重要な注意を参照してください)、成功すると、以下のトラバースを回避します .これは、エスケープされた括弧を使用して単一の式としてグループ化され、-not
のプレフィックスが付けられます find
になります その表現に一致したものはすべてスキップします。
-not
を追加するかどうかを尋ねる人がいるかもしれません -prune
によって他のすべてのファイルが隠されるわけではありません 再び現れ、答えはノーです。道 -prune
機能するのは、一度到達すると、そのディレクトリの下のファイルが永久に無視されることです.
これは、wintersmith によって生成されたいくつかのファイルで yui-compressor を呼び出す必要があったが、そのまま送信する必要があるその他のファイルを除外する必要があった実際のユース ケースに由来します。
注 [1] :/tmp/foo/bar
を除外したい場合 そして、次のように find を実行します "find /tmp \(...
" その場合、-path /tmp/foo/bar
を指定する必要があります .一方、次のように find を実行すると cd /tmp; find . \(...
-path ./foo/bar
を指定する必要があります .