files exclude unix search shell command-line grep

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



grep except (22)

En los directorios también hay muchos archivos binarios. No puedo buscar solo en ciertos directorios (la estructura del directorio es un gran lío). ¿Hay una mejor manera de grepping 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. Compruebe el análisis detallado aquí .

Así que puedes simplemente correr:

rg "some_pattern"

.gitignore su .gitignore y omite automáticamente archivos / directorios ocultos y 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 ayuda.

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

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


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

El comando sugerido:

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

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


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 )


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

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


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


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


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.


Mira @ este.

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


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="



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" *

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}


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


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

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

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


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.


Utilice la sintaxis de shell globbing:

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

La sintaxis para --exclude es idéntica.

Tenga en cuenta que la estrella se escapa con una barra invertida para evitar que sea expandida por el shell (citándolo, como --include="*.{cpp,h}" , funcionaría igual de bien). De lo contrario, si tuviera algún archivo en el directorio de trabajo actual que coincidiera con el patrón, la línea de comandos se expandiría a algo como grep pattern -r --include=foo.cpp --include=bar.h rootdir , que solo buscaría archivos Se llama foo.cpp y bar.h , que probablemente no es lo que querías.


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


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="


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