SOLUCIÓN 1 (combinar find y grep )
El propósito de esta solución no es tratar con grep rendimiento pero para mostrar una solución portátil:también debería funcionar con busybox o una versión de GNU anterior a la 2.5.
Usa 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 el --exclude-dir opción de grep ):
Ya conoce 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 por humanos.
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
Para excluir varios directorios, use --exclude-dir como:
--exclude-dir={node_modules,dir1,dir2,dir3}
SOLUCIÓN 3 (Ag)
Si busca con frecuencia a través del 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 engorrosas a grep o find .
Versiones recientes de GNU Grep (>=2.5.2) proporcionar:
--exclude-dir=dir
que excluye directorios que coincidan con el patrón dir de búsquedas recursivas en 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 del manual de GNU para la selección de archivos y directorios
- Una respuesta de StackOverflow relacionada Usa la sintaxis grep --exclude/--include para no grep a través de ciertos archivos
Para GNU Greps más antiguos y POSIX Grep , usa find como se sugiere en otras respuestas.
O simplemente use ack (Editar :o El buscador de plata ) ¡y listo!