zipファイルまたはtar.gzファイルにあるファイルの実際のファイル形式をどのように理解できますか?

zipファイルまたはtar.gzファイルにあるファイルの実際のファイル形式をどのように理解できますか?

.tar.gzファイルと.zipファイルが複数あり、解凍することなくこれらのファイルに含まれるファイルの種類を知りたいです。どうすればいいですか?コマンドを使用してtar -tzf 'filename'.tar.gzファイルを一覧表示できますunzip -l 'filename'。このファイルでファイルの種類を識別する方法が見つかりません。この目標をどのように達成できますか?セントース6.6を使用しています

コマンド出力tar -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

出力unzip -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

答え1

GNUの使用tar:

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

ファイルの場合は、次のコマンドを使用してzipすぐに変換し、GNUを再利用して各メンバーを呼び出すことができます。tarbsdtartarfile

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

次の出力が提供されます。

-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

コマンドfileは推測しますタイプファイルの最初の数バイトに基づいてヒューリスティックを使用してファイルを解析します。したがって、何が起こってもファイルからデータを抽出する必要があります。tar tvf出力を報告しても、tar各アーカイブメンバーのコンテンツの前に情報が保存されるため、アーカイブ全体を読み取って解凍する必要がありますが、上記のソリューションのいずれもメンバーを抽出しません。ディスク上、データはパイプを介して前後に転送され、bsdtarアーカイブtarメンバーの内容はメモリに完全に格納されません。tarfile

fileファイルの最初の数バイトを読み取り、返した後、GNUはtarそれを賢明に処理し、次のアーカイブメンバーに対して次のコマンドを実行する前に(SIGPIPEで死ぬのではなく)アーカイブメンバーの残りの部分をスキップしますfile

sh効率性の観点からは、1つのコマンド(解釈されたexec file -b -コマンドライン)と各一般ファイルアーカイブメンバーに対して1つのコマンドを実行するので、最適ではありません。file我々はexec再利用のために同じプロセスを使用shしますfile(この場合、sh実装dash自体は最適化されません)。

答え2

このfileコマンドはファイル自体に関する情報を通知します。

$ 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

ただし、アーカイブ内のファイルの場合は、そのファイルを抽出してfileそれぞれを個別に実行する必要があります。

関連情報