web-dev-qa-db-ja.com

非圧縮Zipがどれだけのスペースを取るかを知る方法

Zipファイルの(非常に長い)リストがある場合、圧縮されていないファイルのサイズを確認するにはどうすればよいですか?

23
Quora Feans

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)。次のスクリプトは、各ファイルを4kBに切り上げ、ファイル名に数バイトを加えた長さで合計サイズを概算します。

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}
'

見て、ループなし!

ループを使用していないが同じ答えに到達するため、わずかに高速になる可能性がある別の解決策を次に示します。

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

「BEGIN {total = 0}」の部分は必須ではありません。

1
WormFood