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?

pengguna238010
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
Volker Siegel
sumber
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
Ole Tange
sumber
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
lebih kotor
sumber
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
RaZieRSarE
sumber
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