¿Cómo saber el tipo de archivo real dentro de un archivo zip o tar.gz?

¿Cómo saber el tipo de archivo real dentro de un archivo zip o tar.gz?

Tengo varios archivos .tar.gz y .zip y quería saber los tipos de archivos dentro de estos archivos sin extraerlos. Cómo puedo conseguir esto. Puedo enumerar los archivos de .tar.gz usando el comando tar -tzf 'filename'y unzip -l 'filename'. No pude encontrar una manera de identificar los tipos de archivos dentro de estos archivos. ¿Cómo puedo lograr esto? Estoy usando centos 6.6

Salida del comandotar -tzf 'test.tar.gz'

-rw-r--r-- root/root     89403 2019-05-26 11:31 abc.tar.gz
-rw------- root/root      2842 2019-05-26 09:41 anaconda-ks.cfg
-rw-r--r-- root/root      8823 2019-05-26 09:41 install.log
-rw-r--r-- root/root      3314 2019-05-26 09:40 install.log.syslog
-rw-r--r-- root/root    122880 2019-05-26 11:28 tin.tar
-rw-r--r-- root/root     25543 2019-05-26 11:20 tito.zip
-rw-r--r-- root/root     25487 2019-05-27 07:48 tito.ZIP

salida deunzip -l test.zip

 Length      Date    Time    Name
---------  ---------- -----   ----
    89403  05-26-2019 11:31   abc.tar.gz
     2842  05-26-2019 09:41   anaconda-ks.cfg
     8823  05-26-2019 09:41   install.log
     3314  05-26-2019 09:40   install.log.syslog
   122880  05-26-2019 11:28   tin.tar
    25543  05-26-2019 11:20   tito.zip
    25487  05-27-2019 07:48   tito.ZIP
---------                     -------
   278292                     7 files

Respuesta1

Con GNU tar:

tar --to-command='exec file -b -' -xvvf file.tar.gz

Para ziplos archivos, puede convertirlos tarsobre la marcha usando bsdtary usar GNU tarnuevamente para llamar filea cada miembro:

bsdtar cf - @file.zip | tar --to-command='exec file -b -' -xvvf -

Da una salida como:

-rw-rw-r-- 0/0            7653 1999-12-30 10:26 WINOBJ.HLP
MS Windows 3.1 help, Thu Dec 30 15:26:17 1999, 7653 bytes
-rw-rw-r-- 0/0            7005 2006-07-28 08:32 Eula.txt
Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators
-rw-rw-r-- 0/0          729464 2011-02-14 11:37 Winobj.exe
PE32 executable (GUI) Intel 80386, for MS Windows

El filecomando adivina eltipode un archivo usando heurística basada en los primeros bytes del archivo. Entonces, en cualquier caso, los datos deben extraerse del archivo. Incluso para informar el tar tvfresultado, tares necesario leer y descomprimir el archivo completo, ya que la información se almacena antes que el contenido de cada miembro del archivo, pero ninguna de las soluciones anteriores extrae los miembros.al disco, los datos se pasan de bsdtarun lado tara otro tara filetravés de tuberías, el contenido de los miembros del archivo ni siquiera se almacena como un todo en la memoria.

Después de fileregresar después de haber leído los primeros bytes del archivo, GNU tarlo maneja inteligentemente y omite el resto del miembro del archivo (en lugar de morir por un SIGPIPE) antes de ejecutar el siguiente filecomando para el siguiente miembro del archivo.

Lo que no es óptimo desde el punto de vista de la eficiencia es que ejecuta uno sh(para interpretar la exec file -b -línea de comando) y un filecomando para cada miembro del archivo normal. Usamos execpara que el mismo proceso se reutilice para shy file(para aquellas shimplementaciones como dashesa no hacen esa optimización por sí mismas).

Respuesta2

El filecomando debería informarle sobre el archivo en sí:

$ file test.zip
test.zip: Zip archive data, at least v1.0 to extract
$ file test.tar.gz
test.tar.gz: gzip compressed data, last modified: Sun May 26 11:28:34 2019, from Uniz

Pero para los archivos dentro de los archivos, deberá extraerlos y ejecutarlos fileen cada uno individualmente.

información relacionada