zip または tar.gz ファイル内のファイルの実際のファイルタイプを知るにはどうすればよいでしょうか?

zip または tar.gz ファイル内のファイルの実際のファイルタイプを知るにはどうすればよいでしょうか?

複数の .tar.gz ファイルと .zip ファイルがあり、これらのファイルを解凍せずに、これらのファイル内のファイルの種類を知りたいです。どうすればいいですか。 コマンドを使用して .tar.gz のファイルを一覧表示できますtar -tzf 'filename'unzip -l 'filename'これらのファイル内のファイルの種類を識別する方法が見つかりませんでした。どうすればいいですか。 Centos 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ファイルの場合は、tarを使用してオンザフライで変換し、再度bsdtarGNU を使用して各メンバーを呼び出すことができます。tarfile

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 tvftarアーカイブ全体を読み取り、解凍する必要があります。情報は各アーカイブメンバーの内容の前に保存されるためです。しかし、上記のソリューションのいずれもメンバーを抽出しません。ディスクに、データはパイプを介してからに渡されbsdtartarからにtar渡されますfileが、アーカイブ メンバーの内容はメモリ内に全体として保存されるわけではありません。

fileファイルの最初の数バイトを読み取った後に戻ると、GNU はtarそれをスマートに処理し、次のアーカイブ メンバーに対して次のコマンドを実行する前に、アーカイブ メンバーの残りをスキップします (SIGPIPE で終了する代わりに) file

効率の観点から最適ではないのは、通常のファイル アーカイブ メンバーごとに 1 つのコマンドsh(exec file -b -コマンド ラインを解釈するため) と 1 つのコマンドを実行することです。およびに同じプロセスが再利用されるように をfile使用します(そのような実装では、独自に最適化を行わないため)。execshfileshdash

答え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個別に実行する必要があります。

関連情報