¿Cómo busco una cadena recursivamente a través de todos los .gz
archivos en todos los directorios y subdirectorios?
¿Cómo busco una cadena recursivamente a través de todos los .gz
archivos en todos los directorios y subdirectorios?
Respuestas:
@ 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.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Entonces algo como
find . -iname "*.gz" -exec zgrep PATTERN {} \
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:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
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 cadena
EDITAR
Investigaciones posteriores revelan que para mi máquina (OS / X) el -exec
argumento para encontrar agregará tantos nombres de archivos como sea posible (similar al xargs
comportamiento).
-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.