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

Resuelto TIMEX asked hace 13 años • 15 respuestas

Quiero recorrer todos los subdirectorios, excepto el node_modulesdirectorio.

TIMEX avatar Jul 04 '11 03:07 TIMEX
Aceptado

Las versiones recientes de GNU Grep (>= 2.5.2 ) proporcionan:

--exclude-dir=dir

que excluye los directorios que coinciden con el patrón dirde las búsquedas recursivas de directorios.

Entonces 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

  • La página de manual de GNU para la selección de archivos y directorios
  • Una respuesta relacionada de StackOverflow Utilice la sintaxis grep --exclude/--include para no buscar en ciertos archivos

Para GNU Greps y POSIX Grep más antiguos , utilice findcomo se sugiere en otras respuestas.

¡ O simplemente usa ack( Editar : o The Silver Searcher ) y listo!

johnsyweb avatar Jan 01 '2012 07:01 johnsyweb

SOLUCIÓN 1 (combinar findy grep)

El propósito de esta solución no es ocuparse del greprendimiento sino mostrar una solución portátil: también debería funcionar con Busybox o una versión GNU anterior a 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 findy 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 (usando la --exclude-diropción 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

Para excluir varios directorios, utilice --exclude-dircomo:

--exclude-dir={node_modules,dir1,dir2,dir3}

SOLUCIÓN 3 (Ag)

Si busca código con frecuencia, 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 es necesario seguir pasando las mismas engorrosas opciones de exclusión a grepo find.

hornetbzz avatar Jul 03 '2011 20:07 hornetbzz

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 buscar 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}

Azodium avatar Apr 21 '2016 16:04 Azodium