Uso
find \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
o
find \( -path "./tmp" -o -path "./scripts" \) -prune -false -o -name "*_peaks.bed"
o
find \( -path "./tmp" -path "./scripts" \) ! -prune -o -name "*_peaks.bed"
L'ordine è importante. Valuta da sinistra a destra. Inizia sempre con l'esclusione del percorso.
Spiegazione
Non utilizzare -not
(o !
) per escludere l'intera directory. Usa -prune
. Come spiegato nel manuale:
−prune The primary shall always evaluate as true; it
shall cause find not to descend the current
pathname if it is a directory. If the −depth
primary is specified, the −prune primary shall
have no effect.
e nel manuale GNU trova:
-path pattern
[...]
To ignore a whole
directory tree, use -prune rather than checking
every file in the tree.
Infatti, se usi -not -path "./pathname"
, find valuterà l'espressione per ogni nodo sotto "./pathname"
.
le espressioni find sono solo una valutazione delle condizioni.
\( \)
- operazione di gruppo (puoi usare -path "./tmp" -prune -o -path "./scripts" -prune -o
, ma è più prolissa).
-path "./script" -prune
- se -path
restituisce true ed è una directory, restituisce true per quella directory e non scendere in essa.
-path "./script" ! -prune
- valuta come (-path "./script") AND (! -prune)
. Ripristina il "sempre vero" di potare in sempre falso. Evita la stampa "./script"
come corrispondenza.
-path "./script" -prune -false
- poiché -prune
ritorna sempre vero, puoi seguirlo con -false
per fare lo stesso di !
.
-o
- Operatore OR. Se non viene specificato alcun operatore tra due espressioni, il valore predefinito è l'operatore AND.
Quindi, \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
è espanso a:
[ (-path "./tmp" OR -path "./script") AND -prune ] OR ( -name "*_peaks.bed" AND print )
La stampa è importante qui perché senza di essa è espansa a:
{ [ (-path "./tmp" OR -path "./script" ) AND -prune ] OR (-name "*_peaks.bed" ) } AND print
-print
viene aggiunto da find - ecco perché la maggior parte delle volte non è necessario aggiungerlo nell'espressione. E poiché -prune
restituisce true, stamperà "./script" e "./tmp".
Non è necessario negli altri perché siamo passati -prune
a restituire sempre false.
Suggerimento: puoi usare find -D opt expr 2>&1 1>/dev/null
per vedere come è ottimizzato ed espanso,
find -D search expr 2>&1 1>/dev/null
per vedere quale percorso è controllato.
_peaks.bed
.