圧縮されていないzipがどれだけのスペースを取るかを知る方法


23

(本当に長い)zipファイルのリストが与えられた場合、圧縮解除後のサイズをどのように確認できますか?

回答:


38

あなたはそれを使用unzip -Zt zipnameして、アーカイブコンテンツに関する要約を直接、合計サイズで印刷することでそれを行うことができます。出力の例を次に示します。

unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed:  76.4%

次に、awkを使用して、バイト数を抽出できます。

unzip -Zt a.zip | awk '{print $3}'
14956

最後に、トムの答えのようにforループに入れます。

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total

19

を入力するunzip -l <zipfile>と、zip内のファイルのリストが圧縮されていないサイズで印刷され、次にすべてのファイルの圧縮されていないサイズの合計が印刷されます。

これは人間が読み取れる出力ですが、を使用して機械読み取り可能な数値を取得できますunzip -l <zipfile> | tail -n1 | awk '{ print $1 }'

合計サイズを取得するには:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -l $file | tail -n1 | awk '{ print $1 }') ))
done
echo $total

15

unzip -l各ファイルのサイズをリストし、それらの合計を含む最終行を出力します。したがって、zipファイルをループして、またはの出力をunzip -l "$zip" | awk 'END {print $1}'合計できますunzip -Zt "$zip" | awk 'END {print $3}'。シェルループのunzip -Zt場合、少し速くなる場合があります。

total=0
for z in *.zip; do
  set $(unzip -Zt -- "$z")
  total=$((total + $3))
done

これは、ファイルの合計サイズのみを示しています。ほとんどのファイルシステムはブロック単位でファイルを割り当てるため、各ファイルには小さなオーバーヘッドがあります。名前を保存するスペース、メタデータの一部を保存するスペース、および場合によっては未使用のスペースです。典型的なファイルシステムでは、オーバーヘッドは最大数キロバイトになります。オーバーヘッドはファイルサイズ、ディレクトリ構造(ディレクトリオーバーヘッドのため)、および同じブロック内の複数の小さなファイルをマージするファイルシステムの機能に依存するため、正確には予測できません。

ほとんどのファイルが数キロバイトを超える場合、これについて心配する必要はありません。ただし、ファイルが非常に小さい場合は、オーバーヘッドを考慮する必要があります。繰り返しますが、オーバーヘッドはファイルシステムに依存します。ext4では、各ファイルはブロック全体を埋めます(ほとんどのシステムではデフォルトで4kB)。次のスクリプトは、各ファイルを4 KBに切り上げ、ファイル名に数バイトを加えた長さを加算することにより、合計サイズを概算します。

for z in *.zip; do
  unzip -l -- "$z"
done | awk '
    $2 ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ {total += ($1+4095)/4096*4096 + length($0)}
    END {print total}
'

小さなファイルと、ファイルシステムがzipのように小さなファイルを一緒にパックしないという事実に言及するための+1。知る限りでは、win / OSX / Linux / BSD(つまり、デスクトップやサーバーで/や/ homeを使用することをお勧めできるもの)にはメインストリームファイルシステムはありません。オプションとして小さなファイルパッキングがあります。Reiserfsにはこれを行うオプション(および大きなファイルのテール)がありましたが、メンテナンスされていません。ただし、非常に長いファイルについては考えていませんでした。良いキャッチ。
ピーターコーデス

また、XFS上のiノードのサイズであるため、ファイルごとに256Bまたは512Bの定数を追加することもできます。ただし、ext4はまだ静的にiノードを割り当てるため、iノードに使用されていないスペースには他のデータを保持できません。(ext4のは、空きiノード(のような低数持っている理由はここにありdf -i、それは必要に応じて動的iノードを多くのスペースとして割り当てることができますXFSに比べて)を、。)
ピーター・コルド

1

まあ、ループなし!

ループを使用しないが、同じ答えに到達するため、わずかに高速になる可能性がある別のソリューションを次に示します。

unzip -l \*.zip|awk 'BEGIN{total=0}/        [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'

「BEGIN {total = 0}」の部分は厳密には必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.