Use grep –exclude / – incluya syntax para no grep a través de ciertos archivos

Estoy buscando la cadena 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 están las opciones --include=PATTERN --exclude=PATTERN y --include=PATTERN , pero ¿cuál es el formato del 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 include , grep include exclude , grep exclude y 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 hacer uso de herramientas comunes (como grep o el hallazgo sugerido).

Use la syntax globbing de shell:

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

La syntax para --exclude es idéntica.

Tenga en cuenta que la estrella se escapa con una barra diagonal inversa para evitar que el shell la --include="*.{cpp,h}" , 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 como grep pattern -r --include=foo.cpp --include=bar.h rootdir , que solo buscaría archivos llamado foo.cpp y bar.h , que es bastante probable que no sea lo que quería.

Si solo desea omitir archivos binarios, le sugiero que consulte la opción -I (mayúscula i). 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.

Por favor, eche un vistazo a ack , que está diseñado exactamente para 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=" 

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 ganar el voto de Andy por ack , es el mejor.

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 

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.

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

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

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.

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

Si no eres reacio a usar find , me gusta su función de -prune :

 encontrar [directorio] \
         -name "pattern_to_exclude" -prune \
      -o -name "another_pattern_to_exclude" -prune \
      -o -name "pattern_to_INCLUDE" -print0 \
 |  xargs -0 -I FILENAME grep -IR "patrón" FILENAME

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

En la segunda y tercera líneas, use "*.png" , "*.gif" , "*.jpg" , y así sucesivamente. Utilice tantos de estos -o -name "..." -prune constructs como usted tiene patrones.

En la 4ª línea, necesita otro -o (especifica “o” para find ), los patrones que USTED desea, y necesita un -print o -print0 al final del mismo. Si solo quiere “todo lo demás” que queda después de podar las imágenes *.gif , *.png , etc., use -o -print0 y -o -print0 con la 4ª línea.

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

Para su pregunta en particular, la statement puede ser algo así como:

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

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

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

Prueba este:

  $ encontrar.  -name "* .txt" -type f -print |  archivo xargs |  grep "foo =" |  corte -d: -f1

Fundado aquí: http://sofes.miximages.com/unix/ppre codefind . -not -name ‘.png’ -o -type f -print | xargs grep -icl “foo=”

esos scripts no logran todo el problema … Inténtalo mejor:

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

este script es mucho mejor porque usa expresiones regulares “reales” para evitar directorios de búsqueda. simplemente separa los nombres de carpeta o archivo con “\ |” en grep -v

¡disfrútala! encontrado en mi linux shell! XD

Mira @ este.

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

Si busca de forma no recursiva, puede usar patrones glop para que coincidan con 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 subdubdirectorios:

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

git grep

Utilice git grep que está optimizado para el rendimiento y tiene como objective buscar a través de ciertos archivos.

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

Sintaxis de ejemplo:

 git grep --no-index "some_pattern" 

Para ver más ejemplos, ver:

  • Cómo excluir ciertos directorios / archivos de la búsqueda de git grep .
  • Compruebe si existen varias cadenas o expresiones regulares en un archivo

La --binary-files=without-match para GNU grep hace que salte los archivos binarios. (Equivalente al -I cambio mencionado en otro lugar)

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

adecuado para el archivo tcsh .alias:

 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 debe estar entre comillas. ~ Keith

En los directorios también hay muchos archivos binarios. No puedo buscar solo ciertos directorios (la estructura del directorio es un gran desastre). ¿Hay una forma mejor de agrupar solo en ciertos archivos?

ripgrep

Esta es una de las herramientas más rápidas diseñadas para buscar recursivamente en su directorio actual. Está escrito en Rust , construido sobre el motor de expresiones regulares de Rust para una máxima eficiencia. Verifique el análisis detallado aquí .

Entonces puedes simplemente ejecutar:

 rg "some_pattern" 

.gitignore su .gitignore y omite automáticamente los archivos / directorios ocultos y los archivos binarios.

Aún puede personalizar incluir o excluir archivos y directorios usando -g / --glob . Las reglas de globbing coinciden con .gitignore globs. Compruebe man rg para obtener ayuda.

Para ver más ejemplos, consulte: ¿Cómo excluir algunos archivos que no coinciden con ciertas extensiones con grep?

En macOS, puede instalar a través de brew install ripgrep .

Para ignorar todos los resultados binarios de grep

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

La parte awk filtrará todas las líneas del archivo binario foo coincide con las líneas

Prueba esto:

  1. Cree una carpeta con el nombre “- --F ” debajo de currdir .. (o enlace otra carpeta --F nombre haya cambiado a “- --F “, es decir, double-minus-F
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *