463 votos

Utilice grep--excluir /--incluye sintaxis no grep a través de ciertos archivos

Estoy buscando por la cadena "foo=" (sin las comillas) en archivos de texto en un árbol de directorios. Es en común una máquina Linux, tengo la shell de bash:

grep -ircl "foo=" *

En los directorios también son muchos los archivos binarios que coinciden con "foo=". Como estos resultados no son relevantes y ralentizar la búsqueda, quiero grep para saltarse la búsqueda de estos archivos (principalmente, JPEG y PNG). ¿Cómo puedo hacer eso?

Sé que hay la opción --exclude=PATRÓN y --include=PATRÓN de opciones, pero, ¿qué es el formato de trama? 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.

Buscar en grep incluyen, grep incluir excluir, grep excluir y variantes no encontrar nada relevante

Si hay una mejor manera de grepping sólo en determinados archivos, yo soy todo para él, moviendo los archivos no deseados no es una opción. Yo no puedo buscar sólo en ciertos directorios (la estructura de directorios es un gran desorden, con todo en todas partes). También, no puedo instalar nada, así que tengo que hacer con herramientas comunes (como grep o la propuesta de encontrar).

ACTUALIZACIONES: @Adán Rosenfield's respuesta es justo lo que estaba buscando:

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

@rmeador's respuesta es también una buena solución:

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

Busca de forma recursiva, ignora los archivos binarios, y no se ve en el interior de la Subversión carpetas ocultas.(...)

416voto

Adam Rosenfield Puntos 176408

Usar el shell de la sintaxis global:

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

La sintaxis para --exclude es idéntico.

Tenga en cuenta que la estrella que se escapó con una barra invertida para evitar que se expandió por el shell (citando a la misma, tales como --include="*.{cpp,h}", funcionaría igual de bien). De lo contrario, si usted tenía cualesquiera archivos en el directorio actual de trabajo que coinciden con el patrón, la línea de comandos se expande a algo como grep pattern -r --include=foo.cpp --include=bar.h rootdir, que sólo la búsqueda de archivos con el nombre foo.cpp y bar.h, que es bastante probable que no lo quería.

147voto

rmeador Puntos 15107

Si sólo quieres omitir archivos binarios, sugiero que miras la - I opcional. Ignora los archivos binarios. Regularmente utilizo el siguiente comando:

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

Busca recursivamente, ignora los archivos binarios y no se ve dentro de carpetas de subversión ocultada, para cualquier patrón que quiero. Lo tengo con alias como "grepsvn" en mi caja en el trabajo.

44voto

Andy Lester Puntos 34051

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

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

se realiza con ack como

ack -icl "foo="

Porque ack nunca Mira en archivos binarios de forma predeterminada, y - r está en forma predeterminada. Y si desea que sólo los archivos CPP y H, entonces haz

ack -icl --cpp "foo="

25voto

Corey Puntos 319

grep 2.5.3 introducida el excluir-dir parámetro--que trabajará en la forma que quieras.

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

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

A segundo lugar de Andy votan ack aunque, es el mejor.

19voto

Rushabh Mehta Puntos 310

He encontrado esto después de mucho tiempo, usted puede agregar múltiples incluyen y excluyen como:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: