Utilizar
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"
El orden es importante. Evalúa de izquierda a derecha. Comience siempre con la exclusión del camino.
Explicación
No utilice -not
(o !
) para excluir todo el directorio. Utilice -prune
. Como se explica en el manual:
−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.
y en el manual de búsqueda de GNU:
-path pattern
[...]
To ignore a whole
directory tree, use -prune rather than checking
every file in the tree.
De hecho, si usa -not -path "./pathname"
, find evaluará la expresión para cada nodo debajo "./pathname"
.
Las expresiones de búsqueda son solo evaluación de condiciones.
\( \)
- Operación de grupos (puede usar -path "./tmp" -prune -o -path "./scripts" -prune -o
, pero es más detallado).
-path "./script" -prune
- si -path
devuelve verdadero y es un directorio, devuelve verdadero para ese directorio y no descienda a él.
-path "./script" ! -prune
- se evalúa como (-path "./script") AND (! -prune)
. Revierte el "siempre verdadero" de podar a siempre falso. Evita imprimir "./script"
como un partido.
-path "./script" -prune -false
- dado que -prune
siempre devuelve verdadero, puede seguirlo con -false
para hacer lo mismo que !
.
-o
- Operador OR. Si no se especifica ningún operador entre dos expresiones, el valor predeterminado es el operador AND.
Por lo tanto, \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
se expande a:
[ (-path "./tmp" OR -path "./script") AND -prune ] OR ( -name "*_peaks.bed" AND print )
La impresión es importante aquí porque sin ella se expande a:
{ [ (-path "./tmp" OR -path "./script" ) AND -prune ] OR (-name "*_peaks.bed" ) } AND print
-print
se agrega mediante buscar; es por eso que la mayoría de las veces, no es necesario agregarlo en su expresión. Y dado que -prune
devuelve verdadero, imprimirá "./script" y "./tmp".
No es necesario en los demás porque cambiamos -prune
para devolver siempre falso.
Sugerencia: puede usar find -D opt expr 2>&1 1>/dev/null
para ver cómo se optimiza y expande,
find -D search expr 2>&1 1>/dev/null
para ver qué ruta está marcada.
_peaks.bed
.