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!