¿Cómo puedo excluir directorios de grep-R?


Quiero recorrer todos los subdirectorios, excepto el directorio "node_modules".

Author: TIMEX, 2011-07-04

12 answers

SOLUCIÓN 1 (combinar find y grep)

El propósito de esta solución no es tratar con grep el rendimiento, sino mostrar una solución portátil : también debería funcionar con busybox o GNU versión anterior a 2.5.

Uso find, para excluir directorios foo y bar :

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

Luego combine find y el uso no recursivo de grep, como 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 añado ya que 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 el ser humano.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

SOLUCIÓN 3 (Ag)

Si busca con frecuencia a través del código, Ag (El buscador Plateado) 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 para seguir pasando las mismas opciones de exclusión engorrosas a grep o find.

 145
Author: hornetbzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-16 14:10:10

Versiones Recientes de GNU Grep (>= 2.5.2) proporcionar:

--exclude-dir=dir

Que excluye los directorios que coincidan con el patrón dir de las búsquedas recursivas en directorios.

Así que puedes hacer:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Para obtener un poco más de información sobre la sintaxis y el uso, consulte

Para Greps antiguos de GNU y POSIX Grep, use find como se sugiere en otras respuestas.

O, simplemente, utilizar ack (Editar: o La Plata Buscador) y hacer con ella!

 844
Author: Johnsyweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-16 22:04:55

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 de 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 linux excepto proc directory, boot directory, sys directory y root directory:


grep -rli --exclude-dir={proc,boot,root,sys} hello /

Nota : El el ejemplo anterior debe ser root

Nota 2 (según @ skplunkerin): no agregue espacios después de las comas en {dir1,dir2,dir3}

 59
Author: Azodium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-08 20:30:04

Esta sintaxis

--exclude-dir={dir1,dir2}

Se expande por la cáscara (por ejemplo, Bash), no por grep, en esto:

--exclude-dir=dir1 --exclude-dir=dir2

Citar evitará que el shell lo expanda, por lo que esto no funcionará:

--exclude-dir='{dir1,dir2}'    <-- this won't work

Los patrones usados 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 tal patrón por sí mismo, por lo que para evitar esto, debe citarlo:

--exclude-dir='dir?'

Puedes usar el rizado las llaves y las citas excluyen patrones juntos como esto:

--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.

 17
Author: Derek Veit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-21 22:48:48

Use con frecuencia esto:

grep se puede usar en conjunción con -r (recursivo), i (ignorar mayúsculas y minúsculas) y -o (imprime solo la parte correspondiente de las líneas). Para excluir files use --exclude y para excluir directorios use --exclude-dir.

Poniéndolo juntos terminas con algo como: {[22]]}

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

Describirlo hace que suene mucho más complicado de lo que realmente es. Más fácil de ilustrar con un simple ejemplo.

Ejemplo:

Supongamos que estoy buscando el proyecto actual para todos los lugares donde establezco explícitamente el valor de cadena debugger 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 .eslintrc es ignorado (esto en realidad tiene una regla de linting sobre debugger por lo que debe ser excluido). Del mismo modo, no quiero que mi propio script sea referenciado en ningún resultado.

Para exclusiones de directorios - Deseo excluir node_modules ya que contiene muchas bibliotecas que hacen referencia a debugger y no estoy interesado en esos resultados. También solo deseo omitir .idea y .git directorios ocultos porque no me importan esas ubicaciones de búsqueda tampoco, 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 .
 13
Author: arcseldon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-26 09:28:23

Podrías intentar algo como grep -R search . | grep -v '^node_modules/.*'

 8
Author: DipSwitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-03 20:53:18

Muy útil, especialmente para aquellos que trabajan con el nodo .js donde queremos evitar buscar dentro de "node_modules":

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
 4
Author: Nestor Urquiza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-11 21:00:55

Este funciona para mí

grep <stuff> -R --exclude-dir=<your_dir>

 2
Author: angelo.mastro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-24 11:18:28

Un simple comando de trabajo:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

Arriba I grep para el texto "creativecommons.org "en el directorio actual" dspace " y excluir dirs {log,assetstore}.

Hecho.

 2
Author: Dung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-24 14:23:54
find . ! -name "node_modules" -type d 
 1
Author: Jack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-28 12:45:48

Si estás buscando código en un repositorio git y node_modules está en tu .gitignore, puedes usar git grep. git grep busca en los archivos rastreados en el árbol de trabajo, ignorando todo desde .gitignore

git grep "STUFF"
 1
Author: 0xcaff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 15:39:52

Una forma más sencilla sería filtrar los resultados usando "grep-v".

grep -i needle -R * | grep -v node_modules

 0
Author: Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-22 18:18:19