Cara mengetahui berapa banyak ruang yang dibutuhkan zip yang tidak dikompresi

23

Diberikan daftar file zip (sangat panjang), bagaimana Anda bisa mengetahui ukurannya setelah terkompresi?

Feora Quora
sumber

Jawaban:

38

Anda dapat melakukannya menggunakan unzip -Zt zipnameyang mencetak ringkasan langsung tentang konten arsip, dengan ukuran total. Berikut ini adalah contoh pada outputnya:

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

Kemudian, menggunakan awk, Anda dapat mengekstrak jumlah byte:

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

Akhirnya, letakkan di dalam for loop seperti pada jawaban Tom:

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

Jika Anda mengetik unzip -l <zipfile>, ia mencetak daftar file di dalam zip, dengan ukurannya yang tidak terkompresi, maka ukuran totalnya yang tidak terkompresi.

Ini adalah keluaran yang bisa dibaca manusia, tetapi Anda bisa menggunakan nomor yang bisa dibaca mesin unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'.

Untuk mendapatkan ukuran total:

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

unzip -ldaftar ukuran setiap file dan mencetak baris terakhir dengan jumlah mereka. Jadi Anda dapat mengulang melalui file zip dan menambahkan outputunzip -l "$zip" | awk 'END {print $1}' atau unzip -Zt "$zip" | awk 'END {print $3}'. Untuk perulangan shell, unzip -Ztmungkin sedikit lebih cepat:

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

Itu hanya memberi tahu Anda ukuran total file. Setiap file memiliki overhead kecil: ruang untuk menyimpan namanya, ruang untuk menyimpan beberapa metadata-nya, dan mungkin sedikit ruang yang tidak digunakan karena sebagian besar sistem file mengalokasikan file dalam blok. Pada sistem file biasa, overhead dapat mencapai beberapa kilobyte. Itu tidak bisa diprediksi karena overhead tergantung pada ukuran file, pada struktur direktori (karena overhead direktori), dan pada kemampuan filesystem untuk menggabungkan beberapa file kecil di blok yang sama.

Jika sebagian besar file lebih dari beberapa kilobyte, jangan khawatir tentang hal ini. Tetapi jika file tersebut sangat kecil, Anda mungkin ingin mempertimbangkan overhead. Sekali lagi, overhead tergantung pada sistem file. Pada ext4, setiap file mengisi blok penuh (4kB secara default pada kebanyakan sistem). Script berikut ini mendekati ukuran total dengan membulatkan setiap file hingga 4kB dan menambahkan panjang nama file ditambah beberapa byte.

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}
'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
+1 untuk menyebutkan file kecil dan fakta bahwa filesystem tidak mengemas file kecil bersama-sama dengan cara zip. AFAIK, tidak ada sistem file utama di win / OSX / Linux / BSD (yaitu yang Anda bisa rekomendasikan agar seseorang gunakan untuk / dan / home di desktop atau server mereka) memiliki kemasan file kecil sebagai opsi. Reiserfs memiliki opsi untuk melakukan ini (dan ekor file yang lebih besar), tetapi tidak terawat. Tapi aku belum memikirkan nama file yang panjang . Tangkapan yang bagus.
Peter Cordes
Anda juga dapat menambahkan 256B atau 512B per file konstan, karena itu ukuran sebuah inode (pada XFS). Saya pikir ext4 masih secara statis mengalokasikan inode, jadi, ruang yang tidak digunakan untuk inode tidak bisa menampung data lain. (Inilah sebabnya mengapa ext4 memiliki jumlah inode bebas yang begitu rendah ( df -i), dibandingkan dengan XFS yang secara dinamis dapat mengalokasikan ruang sebanyak mungkin untuk inode yang dibutuhkan.)
Peter Cordes
1

Lihat bu, jangan lup!

Berikut adalah solusi lain, yang mungkin sedikit lebih cepat, karena tidak menggunakan loop, tetapi masih sampai pada jawaban yang sama.

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

Bagian "BEGIN {total = 0}" tidak sepenuhnya diperlukan.

WormFood
sumber