¿Cómo excluir correctamente directorios en buscar?

¿Cómo excluir correctamente directorios en buscar?

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 -pathla 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 -pathpredicado delante del valor de la última opción"./.cache"

La ruta utilizada con -pathdebe 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 -maxdepthsiempre se colocan inmediatamente después searchpath. Los argumentos -pathdeben coincidir con lo que findse 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 -printes 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

información relacionada