recursive help examples egrep linux unix grep

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