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?
Odpowiedzi:
Aby odpowiedzieć na tytuł pytania:
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
-l
opcja 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 -c
jest to właściwe podejście - ale jak odpowiedział @OleTange,zcat
wydaje się, że nie jest to ten zgzip
.Alternatywą jest użycie
gzip
opcji-d
(--decompress
) i-c
(--to-stdout
) w połączeniu zwc
opcją-c
(--bytes
):źródło
-l
Opcja ma błąd dla plików większych niż 4 GB: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775Twój
zcat
nie jest GNU Zcat, ale z kompresu. Próbować:źródło
gzip -l nie działał dla mnie, po prostu git -1 ... ale to zadziałało:
źródło
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 :
aby uzyskać całkowity rozmiar z pliku gz:
źródło