-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 を指定する必要があります .