Diberikan daftar file zip (sangat panjang), bagaimana Anda bisa mengetahui ukurannya setelah terkompresi?
Diberikan daftar file zip (sangat panjang), bagaimana Anda bisa mengetahui ukurannya setelah terkompresi?
Jawaban:
Anda dapat melakukannya menggunakan unzip -Zt zipname
yang 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
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
unzip -l
daftar 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 -Zt
mungkin 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}
'
df -i
), dibandingkan dengan XFS yang secara dinamis dapat mengalokasikan ruang sebanyak mungkin untuk inode yang dibutuhkan.)
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.