web-dev-qa-db-ja.com

解凍せずにターミナルで.tar.gzアーカイブのサイズを確認する

32GBの.tar.gzアーカイブがあり、この圧縮アーカイブを解凍した場合のファイルのサイズを知りたいのですが。最初にアーカイブを解凍するのを避けて、たとえばdu

圧縮アーカイブを解凍せずに含まれているファイルのサイズを調べる(Linuxおよび/またはMacOSXシステムの場合)も可能ですか?

私が知っている別のアーカイブについては、.tar.gzファイルも含まれていることを知っています。アーカイブ内に含まれている解凍されたアーカイブのサイズを計算することもできますか? (たとえば、「開梱」をシミュレートするレベルを設定することによって?)

4
Sven

承知しました。 -tvを使用して、コンテンツとそのサイズを一覧表示します。例えば。

% tar -tvzf sometools2.tar.gz 
-rw-r--r-- madler/admin   3442 2005-02-27 21:40 pngdat.c
-rw-r--r-- madler/admin  24938 2005-02-27 21:39 infgen.c

サイズ(duなど)を合計する場合は、awkを使用できます。

% tar -tvzf sometools2.tar.gz|awk '{ s += $3 } END { print s }'
28380

埋め込まれた.tar.gzファイルの場合、-Oを指定してstdoutに送信することにより、それらを見つけたときに個別に実行する必要があります。

% tar -tvzf imbed.tar.gz 
-rw-r--r-- madler/staff    505 2012-02-12 00:06 lucas.c
-rw-r--r-- madler/staff  27913 2005-03-20 11:10 lzwtry.c
-rw-r--r-- madler/staff   8314 2005-02-27 21:42 sometools2.tar.gz
% tar -xOzf imbed.tar.gz sometools2.tar.gz | tar -tvzf - | awk '{ s += $3 } END { print s }'
28380

-tv出力でそれらを見つけて抽出し、再帰的に実行するスクリプトを作成できます。読者の練習問題として残しておきます。

これらのオプションはGNU tar用であり、LinuxとMac OSXの両方にあります。BSDtarのオプションは異なる場合があります。

4
Mark Adler

まず、.tar.gzサフィックスは、圧縮されたtarファイルであることを意味します。 tarは、複数のファイルとディレクトリを1つのファイルにパックする手段にすぎません。デフォルトでは圧縮はありません。これがgzipの出番です。これは単一のファイルを圧縮するためのツールです。したがって、前述のサフィックスは、ファイルやディレクトリの圧縮されたバンドルであることを意味します。

Zip形式のtarバンドル内の各ファイルの圧縮率を確認する場合は、 Mark Adlerによる回答 を参照してください。

Zipファイル(またはバンドル)全体にのみ関心がある場合、解凍されたサイズを決定する正しい方法は次のとおりです。

gunzip -l ${file}

出力例:

$ gunzip -l syslog.1.gz
     compressed        uncompressed  ratio uncompressed_name
        4465670            33295551  86.6% syslog.1

圧縮された数値と圧縮されていない数値はバイトを示します。私のsyslog.1ファイルは約32MB非圧縮になります。

1

ターミナルでこのようなことをする方法がわかりません(AFAIKは不可能です)。ただし、アーカイブを抽出するためのほとんどのプログラミングライブラリでは、圧縮されたコンテンツ全体を抽出せずに、コンテンツ情報(ツリー、コンテンツのサイズなど)をクエリすることもできます。

したがって、ニーズに合った任意のプログラミング言語でコマンドラインツールを作成し、コマンドラインから呼び出すことができます。

0
Beachwalker