¿Cómo busco una cadena recursivamente a través de todos los .gz
archivos en todos los directorios y subdirectorios?
8
@ Steve Weet ya casi está allí. El uso de / dev / null como argumento adicional es una buena manera de obligar a que se muestre el nombre de archivo (lo recordaré, gracias Steve), pero aún ejecuta el archivo ejecutable para cada archivo encontrado: una gran sobrecarga.
Desea ejecutar zgrep tan pocas veces como sea posible, aprovechando al máximo cada ejecución:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
suministrará tantos args (nombres de archivo) como sea posible para zgrep, y lo ejecutará repetidamente hasta que haya utilizado todos los archivos proporcionados por el find
comando. El uso de las opciones -print0
y le -0
permite funcionar si hay espacios en alguno de los nombres de archivo o directorio.
En Mac OS X, puede lograr el mismo efecto sin xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
para mostrar siempre el nombre del archivo con la línea correspondiente, en GNU grep al menos.Entonces algo como
fuente
zgrep -r
para atravesar un árbol o si -r no funciona,xargs zgrep
/bin/zgrep: -r: option not supported
a mi sistema ubuntu recién instalado.xargs
en su lugar entonces.@aioobe ya casi está allí. El comando hará el trabajo pero no le dirá el nombre del archivo
Lo siguiente también debería decirle el nombre del archivo:
La adición de
/dev/null
asegurará que zgrep vea dos nombres de archivo, por lo que le mostrará el nombre del archivo si encuentra la cadenaEDITAR
Investigaciones posteriores revelan que para mi máquina (OS / X) el
-exec
argumento para encontrar agregará tantos nombres de archivos como sea posible (similar alxargs
comportamiento).fuente
-exec
: soy todo acerca de la portabilidad, así que no lo usaría en un script, pero es genial para el símbolo del sistema.find
, pero la mayoría de las modernas (por ejemplo, en distribuciones basadas en Debian).-H
para mostrar siempre el nombre del archivo con la línea correspondiente, al menos en GNU grep, en lugar del/dev/null
hack.Lo siguiente funciona una delicia en
zsh
También puede trabajar en
bash
,ksh
, etc ...fuente