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 .