.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を再利用して各メンバーを呼び出すことができます。tar
bsdtar
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
。
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
それぞれを個別に実行する必要があります。