
Ich habe mehrere .tar.gz- und .zip-Dateien und wollte die Dateitypen der Dateien in diesen Dateien kennen, ohne sie zu extrahieren. Wie kann ich das erreichen? Ich kann die .tar.gz-Dateien mit dem Befehl tar -tzf 'filename'
und auflisten unzip -l 'filename'
. Ich konnte keine Möglichkeit finden, die Dateitypen in diesen Dateien zu identifizieren. Wie kann ich das erreichen? Ich verwende CentOS 6.6
Ausgabe des Befehlstar -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
Ausgabe vonunzip -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
Antwort1
Mit GNU tar
:
tar --to-command='exec file -b -' -xvvf file.tar.gz
Für zip
Dateien können Sie tar
im laufenden Betrieb mit konvertieren und erneut bsdtar
GNU verwenden, um jedes Mitglied aufzurufen:tar
file
bsdtar cf - @file.zip | tar --to-command='exec file -b -' -xvvf -
Die Ausgabe ähnelt der folgenden:
-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
Der file
Befehl errät dieTypeiner Datei mithilfe von Heuristiken, die auf den ersten paar Bytes der Datei basieren. Die Daten müssen also in jedem Fall aus der Datei extrahiert werden. Selbst um die tar tvf
Ausgabe zu melden, tar
muss das gesamte Archiv gelesen und entpackt werden, da die Informationen vor dem Inhalt jedes Archivmitglieds gespeichert werden, aber keine der oben genannten Lösungen extrahiert die Mitgliederauf Festplattebsdtar
, die Daten werden über Pipes von /nach tar
und von tar
/nach weitergegeben file
, der Inhalt der Archivmitglieder wird nicht einmal als Ganzes im Speicher abgelegt.
Nachdem file
die ersten paar Bytes der Datei gelesen wurden, kehrt GNU zurück, tar
behandelt dies intelligent und überspringt den Rest des Archivmitglieds (anstatt an einem SIGPIPE zu sterben), bevor der nächste file
Befehl für das nächste Archivmitglied ausgeführt wird.
Was aus Effizienzgründen nicht optimal ist, ist, dass es einen sh
(zum Interpretieren der exec file -b -
Befehlszeile) und einen file
Befehl für jedes reguläre Dateiarchivmitglied ausführt. Wir verwenden, exec
damit derselbe Prozess für sh
und wiederverwendet wird file
(da solche sh
Implementierungen dash
diese Optimierung nicht selbst durchführen).
Antwort2
Der file
Befehl sollte Ihnen Informationen über die Datei selbst geben:
$ 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
Die Dateien in den Archiven müssen Sie jedoch extrahieren und file
jede Datei einzeln ausführen.