¿Cómo enumerar el contenido de todos los archivos .zip en una carpeta y grep para un archivo específico?

28

Tengo 348 archivos zip y quiero encontrar un archivo que esté en uno de los archivos zip, unzip -l¿no funciona con comodines?

¿Cómo puedo enumerar el contenido de todos los .ziparchivos y grepmediante la lista combinada de todos los archivos contenidos en las cremalleras?

Eduard Florinescu
fuente

Respuestas:

17

Usar zipinfoes una buena solución aquí. Sin embargo, en general, siempre que desee aplicar un comando a una lista de archivos y el comando no acepte una lista de archivos, puede usar un forbucle:

for file in *.zip; do
    unzip -l "$file"
done \
| grep "\.zip\|setup"

Si el archivo que está buscando tiene espacios como:, your fileen la expresión regular grep, debe escapar de cada espacio con una barra diagonal inversa como grep "\.zip\|your\ file".

Konrad Rudolph
fuente
Funciona perfectamente, el único problema es que no muestra el nombre del zip,
Eduard Florinescu
Edité tu publicación y agregué expresiones regulares para mostrar también el nombre de archivo donde se encuentra la configuración, +1 y aceptar
Eduard Florinescu
Oh sí, había olvidado las citas sobre el argumento de unzip, qué vergonzoso.
Konrad Rudolph el
1
@JaySullivan No use este código, fallará para las rutas que contienen espacios. Nunca canalice la salida de ls. Usted podría utilizar finden su lugar.
Konrad Rudolph
12

Puedes usar zipinfo. Está incluido en la instalación predeterminada de Ubuntu. Consulte la página del manual para más información.

Por ejemplo, para buscar un patrón setupen un grupo de archivos zip en el directorio actual, use este comando:

find ./ -iname *zip 2> /dev/null -print0 | xargs -0 zipinfo | grep setup
Anwar
fuente
Obtengo un caution: filename not matched: case1.zip... caution: filename not matched: case348.zippor cada zip, probado en dos sistemas operativos Ubuntu, 11.10 y 12.04.
Eduard Florinescu
@EduardFlorinescu Prueba la respuesta actualizada. Aunque la respuesta estaba funcionando para mí
Anwar
el problema es que el archivo puede contener eso setupy pone el mismo error, aunque funciona así:zipinfo -l * | grep "setup"
Eduard Florinescu
Edité la respuesta. Creo que es más robusto ahora
Anwar
1
Gracias, +1 por esfuerzo, pero aún así no funcionará si el archivo zip tiene espacios en su nombre.
Eduard Florinescu
6

Para enumerar los archivos en un archivo zip, puede usar el siguiente comando.

unzip -l

Para grep un archivo comprimido, debe utilizar las utilidades de archivo comprimido creadas para trabajar con ese tipo de formato de archivo.

Para archivos zip:

zipgrep --help  
usage: zipgrep [egrep_options] pattern zipfile [members...]
Uses unzip and egrep to search the zip members for a string or pattern.

Para archivos de alquitrán:

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.

OPTIONs are the same as for 'grep'.

Hay algunas otras herramientas que también funcionan con archivos. Puede colocar la salida en grep para hacer lo mismo.

zcat
zcat my.archive.zip | grep "some text"

O puede usar la funcionalidad de búsqueda de estas herramientas

zless
zmore
nelaaro
fuente