Pregunta Use grep --exclude / - incluya sintaxis para no grep a través de ciertos archivos


Estoy buscando la cuerda foo= en archivos de texto en un árbol de directorios. Está en una máquina Linux común, tengo bash shell:

grep -ircl "foo=" *

En los directorios también hay muchos archivos binarios que coinciden con "foo =". Como estos resultados no son relevantes y ralentizan la búsqueda, quiero que grep omita buscar estos archivos (principalmente imágenes JPEG y PNG). ¿Como podría hacerlo?

Sé que hay el --exclude=PATTERN y --include=PATTERN opciones, pero ¿cuál es el formato de patrón? La página man de grep dice:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

Buscando en grep incluye, grep incluyen exclude, grep exclude y las variantes no encontraron nada relevante

Si hay una forma mejor de agrupar solo en ciertos archivos, estoy de acuerdo; mover los archivos ofensivos no es una opción. No puedo buscar solo ciertos directorios (la estructura del directorio es un gran desastre, con todo en todas partes). Además, no puedo instalar nada, así que tengo que ver con herramientas comunes (como grep o el sugerido encontrar)


660
2017-10-21 13:41


origen


Respuestas:


Use la sintaxis globbing de shell:

grep pattern -r --include=\*.{cpp,h} rootdir

La sintaxis para --exclude es idéntico.

Tenga en cuenta que la estrella se escapó con una barra diagonal inversa para evitar que se expanda por el shell (citando, como --include="*.{cpp,h}", funcionaría igual de bien). De lo contrario, si tuviera algún archivo en el directorio de trabajo actual que coincida con el patrón, la línea de comando se expandiría a algo así como grep pattern -r --include=foo.cpp --include=bar.h rootdir, que solo buscaría archivos llamados foo.cpp y bar.h, que es bastante probable que no sea lo que querías.


623
2017-10-21 13:44



Si solo quieres omitir archivos binarios, te sugiero que mires el -I (mayúscula i) opción. Ignora los archivos binarios. Regularmente uso el siguiente comando:

grep -rI --exclude-dir="\.svn" "pattern" *

Busca de forma recursiva, ignora los archivos binarios y no mira dentro de las carpetas ocultas de Subversion, para el patrón que yo quiera. Lo tengo alias como "grepsvn" en mi caja en el trabajo.


198
2017-10-21 14:12



Por favor, eche un vistazo a ack, que está diseñado para exactamente estas situaciones. Tu ejemplo de

grep -ircl --exclude=*.{png,jpg} "foo=" *

se hace con ack como

ack -icl "foo="

porque ack nunca busca en los archivos binarios por defecto, y -r está activado por defecto. Y si solo quieres archivos CPP y H, solo hazlo

ack -icl --cpp "foo="

54
2017-10-21 14:18



grep 2.5.3 introdujo el parámetro --exclude-dir que funcionará de la manera que desee.

grep -rI --exclude-dir=\.svn PATTERN .

También puede establecer una variable de entorno: GREP_OPTIONS = "- exclude-dir = .svn"

Voy a segundo Andy vota por ack sin embargo, es lo mejor.


32
2018-02-04 18:41



Encontré esto después de mucho tiempo, puedes agregar múltiples inclusiones y exclusiones como:

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js

22
2017-12-20 04:54



El comando sugerido:

grep -Ir --exclude="*\.svn*" "pattern" *

es conceptualmente incorrecto, porque --exclude funciona en el nombre base. En otras palabras, omitirá solo .svn en el directorio actual.


11
2017-12-17 18:56



En grep 2.5.1 debe agregar esta línea a ~ / .bashrc o ~ / .bash profile

export GREP_OPTIONS="--exclude=\*.svn\*"

11
2018-04-01 10:13



Encuentro que la salida de grep grep es muy útil a veces:

grep -rn "foo=" . | grep -v "Binary file"

Sin embargo, eso no detiene realmente la búsqueda de los archivos binarios.


9
2017-10-21 13:44



En CentOS 6.6 / Grep 2.6.3, tengo que usarlo así:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

Observe la falta de signos iguales "=" (de lo contrario --include, --exclude, include-dir y --exclude-dir son ignorados)


7
2017-11-07 18:43