
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 zip
los archivos, puede convertirlos tar
sobre la marcha usando bsdtar
y usar GNU tar
nuevamente para llamar file
a 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 file
comando 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 tvf
resultado, tar
es 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 bsdtar
un lado tar
a otro tar
a file
través de tuberías, el contenido de los miembros del archivo ni siquiera se almacena como un todo en la memoria.
Después de file
regresar después de haber leído los primeros bytes del archivo, GNU tar
lo maneja inteligentemente y omite el resto del miembro del archivo (en lugar de morir por un SIGPIPE) antes de ejecutar el siguiente file
comando 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 file
comando para cada miembro del archivo normal. Usamos exec
para que el mismo proceso se reutilice para sh
y file
(para aquellas sh
implementaciones como dash
esa no hacen esa optimización por sí mismas).
Respuesta2
El file
comando 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 file
en cada uno individualmente.