Se -prune
non funziona per te, questo:
find -name "*.js" -not -path "./directory/*"
Avvertimento: richiede l'attraversamento di tutte le directory indesiderate.
Usa il -prune
primario. Ad esempio, se desideri escludere ./misc
:
find . -path ./misc -prune -o -name '*.txt' -print
Per escludere più directory, OPPURE tra parentesi.
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
E, per escludere directory con un nome specifico a qualsiasi livello, usa -name
primary invece di -path
.
find . -type d -name node_modules -prune -o -name '*.json' -print
Trovo più facile ragionare su quanto segue rispetto ad altre soluzioni proposte:
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
Nota importante: i percorsi digitati dopo -path
deve corrispondere esattamente a find
verrebbe stampato senza l'esclusione. Se questa frase ti confonde, assicurati di utilizzare percorsi completi attraverso l'tutto comando come questo:find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
. Vedi nota [1] se desideri una migliore comprensione.
Dentro \(
e \)
è un'espressione che corrisponderà esattamente build/external
(vedi la nota importante sopra) e, in caso di successo, eviterà di attraversare qualsiasi punto sottostante . Questo viene quindi raggruppato come una singola espressione con la parentesi di escape e preceduto da -not
che farà find
salta tutto ciò che è stato abbinato a quell'espressione.
Ci si potrebbe chiedere se aggiungere -not
non renderà tutti gli altri file nascosti da -prune
riapparire, e la risposta è no. La via -prune
funziona è che tutto ciò che, una volta raggiunto, i file al di sotto di quella directory vengono permanentemente ignorati.
Questo deriva da un caso d'uso reale, in cui avevo bisogno di chiamare yui-compressor su alcuni file generati da Wintersmith, ma tralasciando altri file che devono essere inviati così come sono.
Nota [1] :se vuoi escludere /tmp/foo/bar
ed esegui find in questo modo "find /tmp \(...
" quindi devi specificare -path /tmp/foo/bar
. Se invece corri trovi così cd /tmp; find . \(...
allora devi specificare -path ./foo/bar
.