Jak mogę uzyskać nieskompresowany rozmiar pliku gzip bez jego faktycznej dekompresji?


25

Proszę znaleźć moje dane systemu operacyjnego:

$ uname -a
AIX xxyy 1 6 000145364C00

Próbowałem następujące polecenie, aby uzyskać rozmiar pliku w archiwum gzip:

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

Nie wiesz, jak z tego interpretować rozpakowany rozmiar. Rozmiar skompresowanego pliku blisko 4 GB.

Wypróbowałem więc tę opcję, aby przechwycić prawidłowe dane:

$ zcat mycontent.DAT.Gz | wc -c

Daje mi ten błąd:

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

Czy możesz mi powiedzieć, jak przechwycić tę wartość ze skryptu powłoki bez rozpakowywania pliku źródłowego?


Czy jesteś pewien integralności archiwum? Podaje swój własny skompresowany rozmiar jako ~ 1,7G. Jeśli to naprawdę ~ 4 GB, zgaduję, że jest problem.
terdon

Odpowiedzi:


26

Aby odpowiedzieć na tytuł pytania:

Jak mogę uzyskać nieskompresowany rozmiar pliku gzip bez jego faktycznej dekompresji?

Jak oczywiście wiesz, opcja -l( --list) zwykle pokazuje rozmiar nieskompresowany.
To, co pokazuje, nie jest obliczane na podstawie danych, ale zostało zapisane w nagłówku jako część skompresowanego pliku.

W twoim przypadku -lopcja nie działa z jakiegoś powodu.
Ale nie jest możliwe „zmierzenie” nieskompresowanego rozmiaru z surowych skompresowanych danych - po prostu nie ma informacji o niczym innym w skompresowanych danych - co nie jest zaskakujące, ponieważ celem kompresji jest pominięcie wszystkiego, co nie jest potrzebne.

Nie musisz przechowywać nieskompresowanych danych na dysku: zcat file.gz | wc -cjest to właściwe podejście - ale jak odpowiedział @OleTange, zcatwydaje się, że nie jest to ten z gzip.
Alternatywą jest użycie gzipopcji -d( --decompress) i -c( --to-stdout) w połączeniu z wcopcją -c( --bytes):

gzip -dc file.gz | wc -c

13
-lOpcja ma błąd dla plików większych niż 4 GB: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Flimm

6

Twój zcatnie jest GNU Zcat, ale z kompresu. Próbować:

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

To dekompresuje plik źródłowy. Może tego chce OP, ale to nie jest odpowiedź na pytanie.
Marco

Ach, to wyjaśnia, dlaczego szukał pliku z rozszerzeniem .Z
Hennes,

0

gzip -l nie działał dla mnie, po prostu git -1 ... ale to zadziałało:

unzip -l file.zip

0

Znajduję wszystkie witryny w sieci i nie rozwiązuję tego problemu, gdy rozmiar pliku jest większy niż 4 GB.

moje rozwiązanie jest takie :

[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

aby uzyskać całkowity rozmiar z pliku 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
To byłaby lepsza odpowiedź, gdybyś wyjaśnił, że działa tylko w przypadku tarballi i wyczyściłeś go (limit czasu nie jest konieczny i nie jest grep).
kbolino,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.