linux - recursive - ls grep




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

Esta funciona para mí

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

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


Esta sintaxis

--exclude-dir={dir1,dir2}

se expande por el shell (por ejemplo, Bash), no por grep , en esto:

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

La cotización evitará que el shell la expanda, por lo que esto no funcionará:

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

Los patrones utilizados 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 dicho patrón, por lo tanto, para evitar esto, debe citarlo:

--exclude-dir='dir?'

Puede utilizar las llaves y los patrones de exclusión citados juntos de esta manera:

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


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

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

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


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

git grep "STUFF"

Un comando de trabajo simple:

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

Anteriormente, grep para el texto "creativecommons.org" en el directorio actual "dspace" y excluyo los directorios {log, assetstore}.

Hecho.


Con frecuencia usa esto:

grep se puede utilizar junto con -r (recursivo), i (ignorar mayúsculas) y -o (imprime solo una parte de líneas coincidente). Para excluir files use --exclude y para excluir directorios use --exclude-dir .

Poniéndolo junto terminas con algo como:

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

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

Ejemplo:

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

Para las exclusiones de directorios: deseo excluir node_modules ya que contiene muchas bibliotecas que hacen referencia al debugger y no estoy interesado en esos resultados. También deseo omitir los directorios ocultos .idea y .git porque tampoco me importan esos lugares de búsqueda, 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 .

SOLUCIÓN 1 (combinar find y grep )

El propósito de esta solución no es lidiar con el rendimiento de grep , sino mostrar una solución portátil: también debería funcionar con la versión de busybox o GNU anterior a la 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 la find y el uso no recursivo de grep , como una 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 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

SOLUCIÓN 3 (AG)

Si busca frecuentemente en el 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 incómodas a grep o find .







grep