Sıkıştırılmamış bir zip'in ne kadar yer kaplayacağını nasıl bilebilirim?


23

Zip dosyalarının (gerçekten uzun) bir listesi göz önüne alındığında, bir defa sıkıştırılmamış dosyaların boyutunu nasıl anlarsınız?

Yanıtlar:


38

Bunu unzip -Zt zipname, arşiv içeriği hakkında doğrudan bir özet yazdırarak toplam boyutuyla yapabilirsiniz. İşte çıktısına bir örnek:

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

Ardından, awk kullanarak bayt sayısını çıkarabilirsiniz:

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

Sonunda, Tom'un cevabındaki gibi bir for döngüsüne koyun:

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

19

Eğer yazarsanız unzip -l <zipfile>, bu onların sıkıştırılmamış boyutları, bunların hepsinin bu durumda toplam sıkıştırılmamış boyutu ile, zip içindeki dosyaların bir listesini yazdırır.

Bu insan tarafından okunabilir bir çıktıdır, ancak kullanarak makinede okunabilen bir sayı alabilirsiniz unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'.

Toplam boyut almak için:

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 -lHer dosyanın boyutunu listeler ve toplamı ile birlikte bir son satır basar. Böylece zip dosyaları arasında dolaşıp çıktısınıunzip -l "$zip" | awk 'END {print $1}' veya çıktısını ekleyebilirsinizunzip -Zt "$zip" | awk 'END {print $3}' . Bir kabuk döngüsü unzip -Ztiçin biraz daha hızlı olabilir:

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

Bu sadece dosyaların toplam boyutunu gösterir. Her dosyanın küçük bir ek yükü vardır: adlarının depolanacağı alan, meta verilerinin bazılarının depolanacağı alan ve muhtemelen bir miktar kullanılmayan alan, çünkü çoğu dosya sistemi dosyaları bloklara ayırır. Tipik dosya sistemlerinde ek yük birkaç kilobayta kadar olabilir. Bu, tam olarak tahmin edilebilir değildir çünkü ek yük, dosya boyutuna, dizin yapısına (ek yükün dizini nedeniyle) ve dosya sisteminin aynı blokta birden fazla küçük dosyayı birleştirme yeteneklerine bağlıdır.

Dosyaların çoğu birkaç kilobayttan fazlaysa, bu konuda endişelenmeyin. Ancak dosyalar çok küçükse, ek yükü hesaba katmak isteyebilirsiniz. Bir kez daha, genel gider dosya sistemine bağlıdır. Ext4'te, her dosya tam bir blok doldurur (çoğu sistemde varsayılan olarak 4kB). Aşağıdaki komut dosyası, her dosyayı 4 kb'ye kadar yuvarlayarak ve dosya adının uzunluğunu artı birkaç bayt ekleyerek toplam boyuta yaklaşır.

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

Küçük dosyalardan ve dosya sistemlerinin bir zip dosyası gibi küçük dosyaları bir araya getirmediği gerçeğinden bahseden +1. AFAIK, win / OSX / Linux / BSD'de ana dosya sistemi yok (yani, birisinin masaüstünde veya sunucusunda / ve / home için kullanmasını tavsiye edebileceğiniz) seçenek olarak küçük bir dosya paketi var. Reiserfs bunu (ve daha büyük dosyaların kuyruklarını) yapma seçeneğine sahipti, ancak hala korunmuyor. Yine de, çok uzun dosya isimleri düşünmemiştim . İyi yakalama.
Peter Cordes

Ayrıca dosya başına 256B veya 512B sabit ekleyebilirsiniz, çünkü bu bir inode'un büyüklüğüdür (XFS'de). Ext4'ün hala statik olarak inode'lar tahsis ettiğini düşünüyorum, bu yüzden inodes için kullanılmayan alan zaten başka veri tutamıyordu. (Bu nedenle ext4'ün, df -iihtiyaç duyduğu kadar inodlara dinamik olarak çok fazla alan ayırabilen XFS'ye kıyasla çok sayıda serbest inode ( ) vardır.)
Peter Cordes

1

Bak anne, halka yok!

İşte size biraz daha hızlı olabilecek başka bir çözüm var, çünkü döngü kullanmıyor, ancak yine de aynı cevaba varıyor.

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

"BEGIN {total = 0}" bölümü kesinlikle gerekli değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.