¿Cómo busco una cadena recursivamente a través de todos los .gzarchivos 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
xargssuministrará tantos args (nombres de archivo) como sea posible para zgrep, y lo ejecutará repetidamente hasta que haya utilizado todos los archivos proporcionados por el findcomando. El uso de las opciones -print0y le -0permite 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 {} +
-Hpara mostrar siempre el nombre del archivo con la línea correspondiente, en GNU grep al menos.Entonces algo como
fuente
zgrep -rpara atravesar un árbol o si -r no funciona,xargs zgrep/bin/zgrep: -r: option not supporteda mi sistema ubuntu recién instalado.xargsen 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/nullasegurará 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
-execargumento para encontrar agregará tantos nombres de archivos como sea posible (similar alxargscomportamiento).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).-Hpara mostrar siempre el nombre del archivo con la línea correspondiente, al menos en GNU grep, en lugar del/dev/nullhack.Lo siguiente funciona una delicia en
zshTambién puede trabajar en
bash,ksh, etc ...fuente