Necesito excluir .git
de mi find
búsqueda. Para lograr eso, estoy usando el -path ./.git -prune
interruptor:
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
Sin embargo, aunque esto omite el contenido del directorio .git, enumera el directorio en sí. Funciona cuando agrego-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
¿Por qué es esto necesario? Pensé que ambos comandos deberían tener la misma salida. La segunda sintaxis es bastante fea.
-print
, de lo contrario, lo implícito se-print
aplica a toda la condiciónRespuestas:
La
man
página parafind
da:Entonces, en el primer ejemplo, no es así que
-path ./.git -prune
sea falso y, por lo tanto-print
, no se llamaría a la acción predeterminada ( ), por lo tanto, se imprime la línea.fuente
Estaba confundido en cuanto a por qué los directorios podados también estaban siendo impresos por el
find
comando, y algunos otros detalles intrincados de cómo-prune
funcionaba, pero pude resolverlo con algunos ejemplos.Para ejecutar los siguientes ejemplos, cree los siguientes directorios y archivos.
Para crear esta estructura:
Ahora use find para buscar directorios con nombre
aa
. No hay problema aqui.Busque todos los directorios que no sean aa y obtenemos el directorio actual
.
y./bb
, que también tiene sentido.Hasta ahora todo bien, pero cuando usamos
-prune
, find devuelve el directorio que estamos podando, lo que inicialmente me confundió porque esperaba que devolviera todos los otros directorios y no el que se estaba podando.La razón por la que devuelve el directorio que se está podando se explica, no en la
-prune
sección de las páginas del manual como se indica en la respuesta de Timo , sino en laEXPRESSIONS
sección:lo que significa que, dado que la expresión coincide con el
aa
nombre del directorio, la expresión se evaluará como verdadera y se imprimirá porque find agrega implícitamente-print
a al final de todo el comando. Sin-print
embargo, no agregará a si agrega deliberadamente la acción-o -print
al final usted mismo:Aquí el comando find NO agrega más un implícito
-print
, por lo que el directorio que estamos podando (aa
) no se imprimirá.Entonces, finalmente, si agregamos una cláusula que busca archivos con un patrón de nombre de archivo
file*
después de-o
, entonces debe colocar un-print
al final de esa segunda cláusula como esta:La razón por la que esto funciona es la misma: si no coloca un
-print
en la segunda cláusula, ya que no hay otra acción que no sea la-prune
acción, find agregará-print
automáticamente al final del comando, haciendo que la-prune
cláusula imprima el directorio podado:En general, debe colocar el
-print
comando en la segunda cláusula. Si lo coloca en el medio como lo hizo el póster original, no funcionará correctamente porque los archivos que se están podando se imprimirán de inmediato y la segunda cláusula no tendrá la oportunidad de elegir los archivos que desea:Así que desafortunadamente, el póster original recibió el comando incorrecto arriba al colocarlo
-print
en el lugar equivocado. Podría haber funcionado para su caso específico, pero no funciona en el caso general.Hay miles de personas que tienen dificultades para entender cómo
-prune
funciona. Lafind
página de manual debe actualizarse para evitar la interminable confusión mundial sobre este comando.fuente
find-4.6.0
) dice: "Si la expresión completa no contiene otras acciones que no sean -prune o -print, -print se realiza en todos los archivos para los que la expresión completa es verdadera". Pero funciona como lo describe.de la
man
página,Entonces, puede ser que pueda usar:
Esto no enumerará el
.git
directorio.para especificar un nombre de archivo, puede hacer esto:
Tenga en cuenta el
,
operador de coma.fuente
Aquí hay una alternativa rápida y sucia:
Simplemente no puedo recordar
find
la sintaxis compleja ...fuente