Wie erkennt man den tatsächlichen Dateityp der Dateien in einer ZIP- oder TAR.GZ-Datei?

Wie erkennt man den tatsächlichen Dateityp der Dateien in einer ZIP- oder TAR.GZ-Datei?

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 zipDateien können Sie tarim laufenden Betrieb mit konvertieren und erneut bsdtarGNU verwenden, um jedes Mitglied aufzurufen:tarfile

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 fileBefehl 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 tvfAusgabe zu melden, tarmuss 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 tarund von tar/nach weitergegeben file, der Inhalt der Archivmitglieder wird nicht einmal als Ganzes im Speicher abgelegt.

Nachdem filedie ersten paar Bytes der Datei gelesen wurden, kehrt GNU zurück, tarbehandelt dies intelligent und überspringt den Rest des Archivmitglieds (anstatt an einem SIGPIPE zu sterben), bevor der nächste fileBefehl 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 fileBefehl für jedes reguläre Dateiarchivmitglied ausführt. Wir verwenden, execdamit derselbe Prozess für shund wiederverwendet wird file(da solche shImplementierungen dashdiese Optimierung nicht selbst durchführen).

Antwort2

Der fileBefehl 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 filejede Datei einzeln ausführen.

verwandte Informationen