linux - help - ¿Cómo puedo excluir directorios de grep-R?
linux grep string (12)
Quiero atravesar todos los subdirectorios, excepto el directorio "node_modules".
Esta funciona para mí
grep <stuff> -R --exclude-dir=<your_dir>
Esta sintaxis
--exclude-dir={dir1,dir2}
se expande por el shell (por ejemplo, Bash), no por grep
, en esto:
--exclude-dir=dir1 --exclude-dir=dir2
La cotización evitará que el shell la expanda, por lo que esto no funcionará:
--exclude-dir=''{dir1,dir2}'' <-- this won''t work
Los patrones utilizados con --exclude-dir
son el mismo tipo de patrones descritos en la página de manual para la opción --exclude
:
--exclude=GLOB
Skip files whose base name matches GLOB (using wildcard matching).
A file-name glob can use *, ?, and [...] as wildcards, and / to
quote a wildcard or backslash character literally.
El shell generalmente intentará expandir dicho patrón, por lo tanto, para evitar esto, debe citarlo:
--exclude-dir=''dir?''
Puede utilizar las llaves y los patrones de exclusión citados juntos de esta manera:
--exclude-dir={''dir?'',''dir??''}
Un patrón puede abarcar múltiples segmentos de ruta:
--exclude-dir=''some*/?lse''
Esto excluiría un directorio como topdir/something/else
.
Las versiones recientes de GNU Grep (> = 2.5.2 ) proporcionan:
--exclude-dir=dir
que excluye los directorios que coinciden con el directorio de patrones de las búsquedas de directorios recursivas
Así que puedes hacer:
grep -R --exclude-dir=node_modules ''some pattern'' /path/to/search
Para más información sobre la sintaxis y el uso, consulte
- La página de manual de GNU para la selección de archivos y directorios
- Una respuesta relacionada de Use grep --exclude / - incluye sintaxis para no grep a través de ciertos archivos
Para GNU Greps más antiguos y POSIX Grep , use find
como se sugiere en otras respuestas.
O simplemente usa ack
( Edit : o The Silver Searcher ) y ¡listo!
Muy útil, especialmente para aquellos que tratan con Node.js donde queremos evitar buscar dentro de "node_modules":
find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
Podrías probar algo como grep -R search . | grep -v ''^node_modules/.*''
grep -R search . | grep -v ''^node_modules/.*''
Si desea excluir varios directorios:
"r" para recursivo, "l" para imprimir solo los nombres de los archivos que contienen coincidencias y "i" para ignorar las distinciones entre mayúsculas y minúsculas:
grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search
Ejemplo: quiero encontrar archivos que contengan la palabra ''hola''. Quiero buscar en todos mis directorios de Linux, excepto el directorio proc , el directorio de inicio , el directorio sys y el directorio raíz :
grep -rli --exclude-dir={proc,boot,root,sys} hello /
Nota: el ejemplo anterior debe ser root
Nota 2 (según @skplunkerin): no agregue espacios después de las comas en {dir1,dir2,dir3}
Si está buscando grep para el código en un repositorio de git y node_modules
está en su .gitignore
, puede usar git grep
. git grep
busca los archivos rastreados en el árbol de trabajo, ignorando todo desde .gitignore
git grep "STUFF"
Un comando de trabajo simple:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
Anteriormente, grep para el texto "creativecommons.org" en el directorio actual "dspace" y excluyo los directorios {log, assetstore}.
Hecho.
Una forma más sencilla sería filtrar los resultados utilizando "grep -v".
grep -i needle -R * | grep -v node_modules
Con frecuencia usa esto:
grep
se puede utilizar junto con -r
(recursivo), i
(ignorar mayúsculas) y -o
(imprime solo una parte de líneas coincidente). Para excluir files
use --exclude
y para excluir directorios use --exclude-dir
.
Poniéndolo junto terminas con algo como:
grep -rio --exclude={filenames comma separated} /
--exclude-dir={directory names comma separated} <search term> <location>
Describirlo lo hace parecer mucho más complicado de lo que realmente es. Más fácil de ilustrar con un simple ejemplo.
Ejemplo:
Supongamos que estoy buscando un proyecto actual para todos los lugares donde establezco explícitamente el debugger
valores de cadena durante una sesión de depuración y ahora deseo revisar / eliminar.
Escribo un script llamado findDebugger.sh
y uso grep
para encontrar todas las ocurrencias. Sin embargo:
Para las exclusiones de archivos: deseo asegurarme de que se ignore .eslintrc
(esto en realidad tiene una regla de alineación sobre el debugger
por lo que debería ser excluido). Del mismo modo, no quiero que mi propio script sea referenciado en ningún resultado.
Para las exclusiones de directorios: deseo excluir node_modules
ya que contiene muchas bibliotecas que hacen referencia al debugger
y no estoy interesado en esos resultados. También deseo omitir los directorios ocultos .idea
y .git
porque tampoco me importan esos lugares de búsqueda, y deseo mantener el rendimiento de la búsqueda.
Así que aquí está el resultado: creo un script llamado findDebugger.sh
con:
#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} /
--exclude-dir={node_modules,.idea,.git} debugger .
SOLUCIÓN 1 (combinar find
y grep
)
El propósito de esta solución no es lidiar con el rendimiento de grep
, sino mostrar una solución portátil: también debería funcionar con la versión de busybox o GNU anterior a la 2.5.
Utilice find
, para excluir directorios foo y bar:
find /dir /( -name foo -prune /) -o /( -name bar -prune /) -o -name "*.sh" -print
Luego combine la find
y el uso no recursivo de grep
, como una solución portátil:
find /dir /( -name node_modules -prune /) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null /;
SOLUCIÓN 2 (uso recursivo de grep
):
Ya conoces esta solución, pero la agrego porque es la solución más reciente y eficiente. Tenga en cuenta que esta es una solución menos portátil pero más legible para los humanos.
grep -R --exclude-dir=node_modules ''some pattern'' /path/to/search
SOLUCIÓN 3 (AG)
Si busca frecuentemente en el código, Ag (The Silver Searcher) es una alternativa mucho más rápida a grep, que está personalizada para buscar código. Por ejemplo, ignora automáticamente los archivos y directorios enumerados en .gitignore
, por lo que no tiene que seguir pasando las mismas opciones de exclusión incómodas a grep
o find
.
find . ! -name "node_modules" -type d