Wenn -prune
nicht für Sie funktioniert, wird dies:
find -name "*.js" -not -path "./directory/*"
Vorsicht: erfordert das Durchlaufen aller unerwünschten Verzeichnisse.
Verwenden Sie die -prune
primär. Zum Beispiel, wenn Sie ./misc
ausschließen möchten :
find . -path ./misc -prune -o -name '*.txt' -print
Um mehrere Verzeichnisse auszuschließen, OR sie in Klammern.
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
Um Verzeichnisse mit einem bestimmten Namen auf jeder Ebene auszuschließen, verwenden Sie den -name
primär statt -path
.
find . -type d -name node_modules -prune -o -name '*.json' -print
Ich finde Folgendes einfacher zu begründen als andere Lösungsvorschläge:
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
Wichtiger Hinweis: die Pfade, die Sie nach -path
eingeben muss genau mit find
übereinstimmen würde ohne den Ausschluss drucken. Wenn dieser Satz Sie verwirrt, achten Sie einfach darauf, ganze vollständige Pfade zu verwenden Befehl wie folgt:find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
. Siehe Anmerkung [1] für ein besseres Verständnis.
Innerhalb von \(
und \)
ist ein Ausdruck, der genau übereinstimmt build/external
(siehe wichtigen Hinweis oben) und wird bei Erfolg vermeiden, irgendetwas darunter zu durchqueren . Dies wird dann als einzelner Ausdruck mit der Escape-Klammer gruppiert und mit -not
vorangestellt was find
ergibt alles überspringen, was diesem Ausdruck entspricht.
Man könnte fragen, ob man -not
hinzufügt wird nicht alle anderen Dateien durch -prune
verstecken wieder auftauchen, und die Antwort ist nein. Der Weg -prune
funktioniert ist, dass, sobald es erreicht ist, die Dateien unterhalb dieses Verzeichnisses dauerhaft ignoriert werden.
Dies stammt aus einem tatsächlichen Anwendungsfall, bei dem ich yui-compressor für einige von Wintersmith generierte Dateien aufrufen musste, aber andere Dateien weglassen musste, die unverändert gesendet werden müssen.
Hinweis [1] :Wenn Sie /tmp/foo/bar
ausschließen möchten und Sie führen find so aus "find /tmp \(...
" dann müssen Sie -path /tmp/foo/bar
angeben . Wenn Sie andererseits find wie folgt ausführen cd /tmp; find . \(...
dann müssen Sie -path ./foo/bar
angeben .