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.