Bagaimana saya bisa mendapatkan ukuran file gzip yang tidak terkompresi tanpa benar-benar mendekompresinya?


25

Silakan temukan detail OS saya:

$ uname -a
AIX xxyy 1 6 000145364C00

Saya sudah mencoba perintah berikut untuk mendapatkan ukuran file di arsip gzip:

$ gzip -l mycontent.DAT.Gz
compressed  uncompr.   ratio   uncompressed_name
-1223644243 1751372002 -75.3%  mycontent.DAT.Gz

Tidak yakin bagaimana menafsirkan ukuran ritsleting dari ini. Ukuran file terkompresi mendekati 4 GB.

Jadi, saya mencoba opsi ini untuk mengambil data yang benar:

$ zcat mycontent.DAT.Gz | wc -c

Ini memberi saya kesalahan ini:

mycontent.DAT.Gz.Z:A file or directory in the path name does not exist.
0

Bisakah Anda memberi tahu saya cara menangkap nilai ini dari skrip shell tanpa mendekompresi file sumber?


Apakah Anda yakin tentang integritas arsip? Ini melaporkan ukurannya sendiri terkompresi sebagai ~ 1.7G. Jika benar-benar ~ 4GB saya kira ada masalah.
terdon

Jawaban:


26

Untuk menjawab judul pertanyaan:

Bagaimana saya bisa mendapatkan ukuran file gzip yang tidak terkompresi tanpa benar-benar mendekompresinya?

Seperti yang Anda ketahui dengan jelas, opsi -l( --list) biasanya menampilkan ukuran yang tidak terkompresi.
Apa yang ditampilkan tidak dihitung dari data, tetapi disimpan di header sebagai bagian dari file terkompresi.

Dalam kasus Anda, -lopsi tidak berfungsi karena suatu alasan.
Tapi itu tidak mungkin untuk 'mengukur' ukuran terkompresi dari data terkompresi mentah - tidak ada informasi tentang hal lain dalam data terkompresi - yang tidak mengejutkan, karena titik kompresi adalah untuk meninggalkan apa pun yang tidak diperlukan.

Anda tidak perlu menyimpan data yang tidak dikompres pada disk: zcat file.gz | wc -cadalah pendekatan yang tepat - tetapi ketika @OleTange menjawab, Anda zcatsepertinya bukan yang dari gzip.
Alternatifnya adalah menggunakan gzipopsi -d( --decompress) dan -c( --to-stdout), dikombinasikan dengan wcopsi -c( --bytes):

gzip -dc file.gz | wc -c

13
The -lpilihan memiliki bug untuk file lebih besar dari 4GB: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Flimm

6

Anda zcatbukan GNU zcat tetapi dari kompres. Mencoba:

gzcat mycontent.DAT.Gz | wc -c
gzip -dc mycontent.DAT.Gz | wc -c

Ini mendekompres file sumber. Mungkin itu yang diinginkan OP, tapi ini bukan jawaban untuk pertanyaan itu.
Marco

Ah, itu menjelaskan mengapa mereka mencari file yang berakhiran .Z
Hennes

0

gzip -l tidak bekerja untuk saya, hanya git -1 ... tapi ini berhasil:

unzip -l file.zip

0

Saya menemukan semua situs di web, dan jangan menyelesaikan masalah ini, dapatkan ukuran ketika ukuran file lebih besar dari 4GB.

solusi saya adalah ini :

[oracle @ base tmp] $ timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz
    -rw-r - r-- oracle / oinstall 111828 2018-03-03 03:05 oracle.20180303.030001.log
    -rw-r ----- oracle / oinstall 6666911744 2018-03-03 03:05 oracle.20180303.030001.dmp

untuk mendapatkan ukuran total dari file gz:

[oracle @ base tmp] $ echo $ (timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk '{print $ 3}') | grep -o '[[: digit:]] *' | awk '{sum + = $ 1} END {print sum}'
    6667023572

1
Ini akan menjadi jawaban yang lebih baik jika Anda menjelaskan bahwa ini hanya berfungsi untuk tarbal dan Anda membersihkannya (batas waktu tidak diperlukan, dan begitu juga grep).
kbolino
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.