Según esta pregunta:Cómo excluir directorios en buscar, el comando debería ser este:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
Pero si lo hago
find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print
Eso da:
find: paths must precede expression: ./.cache'
find: possible unquoted pattern after predicate -o'?
pero hice comillas.
Además, después de -path
la opción, ¿la ruta debe ser absoluta o relativa? Porque he incluido el directorio actual ./[somefile]
, pero ¿es necesario -path
?
Respuesta1
Te has perdido el -path
predicado delante del valor de la última opción"./.cache"
La ruta utilizada con -path
debe comenzar con la ruta de búsqueda de nivel superior utilizada por find
. Por ejemplo
find . -path './something/here'
find /etc -path '/etc/init.d'
Es posible que necesite utilizar el *
comodín si desea hacer coincidir un nombre de directorio sin especificar su posición en el árbol del sistema de archivos. Este ejemplo coincidirá con todos los archivos ( -type f
) en algún lugar del directoriowizard
find . -path '*/wizard/* -type f -print
Respuesta2
Para futuros lectores, las soluciones compatibles con POSIX queno recorra los directorios excluidos y no los incluya en la salida en absolutotener los formatos generales:
Exclusión única
find searchpath \! \( -path searchpath/excludepath -prune \)
Múltiples exclusiones
find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)
Prevenir ese recorrido puede generar unenormemejora del rendimiento cuando esos directorios contienen muchos archivos. La omisión total de los directorios excluidos de la salida evita operar en ellos involuntariamente.
Se pueden colocar más filtros y parámetros de salida.despuéstodos los que se muestran, excepto aquellos que -maxdepth
siempre se colocan inmediatamente después searchpath
. Los argumentos -path
deben coincidir con lo que find
se generaría para ese directorio, y los comodines deben estar entre comillas o escapes.
Para esta pregunta, la solución sería esta (ya que -print
es la opción predeterminada):
find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)
Respuesta3
Llego a esta página cuando busco información para que el comando de búsqueda excluya varios directorios. encuentro la respuesta deWalfel más elegante. De mi experimento, una variación basada en el mismo concepto es:
find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print