
複数の .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
を使用してオンザフライで変換し、再度bsdtar
GNU を使用して各メンバーを呼び出すことができます。tar
file
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
からにtar
渡されますfile
が、アーカイブ メンバーの内容はメモリ内に全体として保存されるわけではありません。
file
ファイルの最初の数バイトを読み取った後に戻ると、GNU はtar
それをスマートに処理し、次のアーカイブ メンバーに対して次のコマンドを実行する前に、アーカイブ メンバーの残りをスキップします (SIGPIPE で終了する代わりに) file
。
効率の観点から最適ではないのは、通常のファイル アーカイブ メンバーごとに 1 つのコマンドsh
(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
個別に実行する必要があります。