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?
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:
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
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
unzip -l
Her 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 -Zt
iç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}
'
df -i
ihtiyaç duyduğu kadar inodlara dinamik olarak çok fazla alan ayırabilen XFS'ye kıyasla çok sayıda serbest inode ( ) vardır.)
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.