Buscando una cadena en múltiples archivos zip


22

Estoy trabajando en SunOS 5.10. Tengo una carpeta que contiene alrededor de 200 archivos zip. Cada archivo zip contiene solo un archivo de texto. Me gustaría buscar una cadena específica en todos los archivos de texto en todos los archivos zip.

Intenté esto (que busca cualquier archivo de texto en el archivo zip que contiene la cadena "ORA-") pero no funcionó.

zipgrep ORA-1680 *.zip

¿Qué es lo correcto de hacerlo sin descomprimir los archivos zip?


Consulte también ¿Cómo hago recursivamente la búsqueda a través de archivos comprimidos? (no es un duplicado exacto, porque los requisitos allí eran más complicados).
Gilles 'SO- deja de ser malvado'

Respuestas:


26

En general, no es posible buscar contenido dentro de un archivo comprimido sin descomprimirlo de una forma u otra. Dado que zipgrep es solo un shellscript, que se descomprime y egrep, puede hacerlo manualmente:

for file in *.zip; do unzip -c "$file" | grep "ORA-1680"; done

Si solo necesita la lista de archivos zip coincidentes, puede usar algo como:

for file in *.zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

De esta manera, solo se descomprime en stdout (es decir, en memoria) en lugar de descomprimir los archivos en el disco. Por supuesto, puede intentar solo grep -alos archivos zip, pero dependiendo del contenido del archivo y su patrón, puede obtener falsos positivos y / o falsos negativos.


¿Dónde la primera opción descomprimiría los archivos?
ziggy

2
unzip -cdescomprime el archivo a stdout. No escribe todo el archivo sin comprimir en ningún otro lugar.
Noah

+1 tks mucho me salva el día. Solo agrego echo "$ file"; descomprimir -c "$ archivo" | grep -q "ORA-1680"; para saber el nombre del archivo + el resultado.
Mike

2
¡Mi versión de unzipusos -ppara la transmisión a la tubería!
gavenkoa

Esto funciona donde todos los comandos de línea única devolvieron "salida estándar", no un nombre de archivo +1
alimack

16

zipgreptoma un solo archivo Para que funcione en varios archivos, colóquelo en un bucle:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done

2
En una línea que también imprime el nombre del archivo zip si hay una coincidencia:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx

4

El sistema de archivos AVFS presenta una vista del sistema de archivos donde /path/to/foo.zipse puede acceder a cada archivo como un directorio ~/.avfs/path/to/foo.zip#. Es un sistema de archivos FUSE , que puede instalar en Solaris. AVFS proporciona acceso de solo lectura a los formatos de archivo de almacenamiento más comunes.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.