¿Cómo puedo excluir directorios de grep -R?
Quiero recorrer todos los subdirectorios, excepto el node_modules
directorio.
Las versiones recientes de GNU Grep (>= 2.5.2 ) proporcionan:
--exclude-dir=dir
que excluye los directorios que coinciden con el patrón dir
de 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 find
como se sugiere en otras respuestas.
¡ O simplemente usa ack
( Editar : o The Silver Searcher ) y listo!
SOLUCIÓN 1 (combinar find
y grep
)
El propósito de esta solución no es ocuparse del grep
rendimiento 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 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 (usando la --exclude-dir
opció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-dir
como:
--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 grep
o find
.
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}