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




grep exclude files (18)

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

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 la búsqueda de estos archivos (en su mayoría imágenes JPEG y PNG). ¿Como podría hacerlo?

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

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

La búsqueda en grep include , grep include exclude , grep exclude y las variantes no encontraron nada relevante

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


adecuado para el archivo .alias tcsh:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

Me tomó un tiempo descubrir que la porción {mm, m, h, cc, c} NO debería estar entre comillas. ~ Keith


Mira @ este.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags

git grep

Utilice git grep que está optimizado para el rendimiento y tiene como objetivo buscar en determinados archivos.

Por defecto, ignora los archivos binarios y .gitignore tu .gitignore . Si no está trabajando con la estructura Git, aún puede usarla pasando --no-index .

Ejemplo de sintaxis:

git grep --no-index "some_pattern"

Para más ejemplos, ver:

  • Cómo excluir ciertos directorios / archivos de git grep search .
  • Compruebe si todas las cadenas múltiples o expresiones regulares existen en un archivo

Si no es reacio a usar find , me gusta su -prune prima:

find [directory] \
        -name "pattern_to_exclude" -prune \
     -o -name "another_pattern_to_exclude" -prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME

En la primera línea, especifique el directorio que desea buscar. . (directorio actual) es una ruta válida, por ejemplo.

En las líneas 2 y 3, use "*.png" , "*.gif" , "*.jpg" , y así sucesivamente. Utilice tantas de estas construcciones de -o -name "..." -prune como tenga patrones.

En la 4ª línea, necesita otra -o (especifica "o" para find ), los patrones que desea, y necesita una -print o -print0 al final de la misma. Si solo quieres "todo lo demás" que queda después de -o -print0 imágenes *.gif , *.png , etc., usa -o -print0 y -o -print0 terminado con la cuarta línea.

Finalmente, en la quinta línea está el conducto a xargs que toma cada uno de esos archivos resultantes y los almacena en una variable FILENAME . Luego pasa grep las banderas -IR , el "pattern" , y luego FILENAME se expande con xargs para convertirse en la lista de nombres de archivos encontrados por find .

Para su pregunta en particular, la declaración puede verse algo como:

find . \
     -name "*.png" -prune \
     -o -name "*.gif" -prune \
     -o -name "*.svn" -prune \
     -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES


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

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

En grep 2.5.1 debe agregar esta línea al perfil ~ / .bashrc o ~ / .bash

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

Prueba esto:

  1. Cree una carpeta llamada " --F " en currdir .. (o vincule otra carpeta --F nombre haya cambiado a " --F ", es decir, double-minus-F .
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *

La --binary-files=without-match para GNU grep hace que se omitan los archivos binarios. (Equivalente al interruptor -I mencionado en otra parte).

(Esto podría requerir una versión reciente de grep ; 2.5.3 la tiene, al menos).


Soy un diletante, concedido, pero así es como se ve mi ~ / .bash_profile:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

Tenga en cuenta que para excluir dos directorios, tuve que usar --exclude-dir dos veces.


encontrar y xargs son tus amigos Úsalos para filtrar la lista de archivos en lugar de grep --exclude

Intenta algo como

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="

Me parece que la salida de grepping grep es muy útil a veces:

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

Sin embargo, eso no impide que busque los archivos binarios.


Para ignorar todos los resultados binarios de grep

grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'

La parte awk filtrará todo el archivo binario. Foo coincide con las líneas



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 archivos binarios de forma predeterminada, y -r está activado de forma predeterminada. Y si solo quiere archivos CPP y H, entonces simplemente haga

ack -icl --cpp "foo="

Si busca de forma no recursiva, puede usar patrones glop para hacer coincidir los nombres de archivo.

grep "foo" *.{html,txt}

Incluye html y txt. Busca solo en el directorio actual.

Para buscar en los subdirectorios:

   grep "foo" */*.{html,txt}

En los subdirectorios:

   grep "foo" */*/*.{html,txt}

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 --include , se --include , --include , include-dir y --exclude-dir )


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

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

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

Sin embargo, secundaré voto para el ack de ack , es el mejor.


esos scripts no logran todo el problema ... Prueba esto mejor:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

esta secuencia de comandos es mucho mejor, ya que utiliza expresiones regulares "reales" para evitar directorios de búsqueda. simplemente separe los nombres de carpetas o archivos con "\ |" en el grep -v

¡disfrútala! encontrado en mi shell de Linux! XD





grep