find
Siempre 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 find
simplemente 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 /mnt
y 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 find
de ignorar los modificadores de exclusión de mi directorio?
Respuesta1
Buscar -path
no 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
:
-mount
No 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 -path
predicado 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 find
recorre 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 *.txt
dentro de él.
ElPágina de manual de GNUEstá bastante claro qué hacer aquí, utilice -prune
en su lugar:
-path pattern
... Para ignorar un árbol de directorios completo, utilice-prune
en lugar de comprobar cada archivo del árbol. Por ejemplo, para omitir el directoriosrc/emacs
y 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