Excluyendo directorios en buscar

Excluyendo directorios en buscar

findSiempre es un completo misterio para mí cada vez que lo uso; Solo quiero excluir todo lo que aparece debajo /mnt(estoy en bash en Ubuntu 20.04 en WSL, así que no quiero que busque en el espacio de Windows) de mi búsqueda, pero findsimplemente cometo un error en esos directorios ignorándome por completo. Encontré la sintaxis en esta página.https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-commandy probé todas las variaciones, todas fallaron.

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

Cuando hago esto, simplemente comete errores /mnty arroja errores (lo cual es realmente frustrante ya que la sintaxis anterior parece clara y la sintaxis de la página de stackoverflow parece correcta):

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

¿Alguien puede mostrarme cómo dejar findde ignorar los modificadores de exclusión de mi directorio?

Respuesta1

Buscar -pathno excluye rutas, significa "no informar ninguna coincidencia cuyo nombre coincida con esta ruta". Seguirá descendiendo a los directorios y los buscará. Lo que quieres es -prune(de man find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

Entonces quieres:

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

Aunque, según lo que intenta excluir, podría ser más fácil de usar -mount(GNU find) u -xdev(otros):

De man find:

-mountNo descienda de directorios en otros sistemas de archivos. Un nombre alternativo para -xdev, por compatibilidad con otras versiones de find.

Entonces:

sudo find / -mount -name 'git-credential-manager*' 

Respuesta2

No ignora la opción. El -pathpredicado se evalúa para todos y cada uno de los archivos encontrados, y para los archivos de ese árbol, simplemente falla. No afecta la forma en que findrecorre el árbol de directorios, y podría tener algo como find . ! -path "./foo/*" -o -name '*.txt'que coincidiera con todo lo que está afuera foo, pero también con los archivos que coincidan *.txtdentro de él.

ElPágina de manual de GNUEstá bastante claro qué hacer aquí, utilice -pruneen su lugar:

-path pattern
... Para ignorar un árbol de directorios completo, utilice -pruneen lugar de comprobar cada archivo del árbol. Por ejemplo, para omitir el directorio src/emacsy todos los archivos y directorios que se encuentran debajo de él, e imprimir los nombres de los otros archivos encontrados, haga algo como esto:

find . -path ./src/emacs -prune -o -print

información relacionada