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 este:
$ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1
Fundada aquí: http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html
Prueba esto:
- Cree una carpeta llamada "
--F
" en currdir .. (o vincule otra carpeta--F
nombre haya cambiado a "--F
", es decir,double-minus-F
. -
#> 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