Po skompresowaniu pliku istnieje sposób szybkiego zapytania go o rozmiar nieskompresowanego pliku (bez jego dekompresji), szczególnie w przypadkach, gdy rozmiar nieskompresowanego pliku jest większy niż 4 GB.
Zgodnie z RFC https://tools.ietf.org/html/rfc1952#page-5 możesz zapytać o ostatnie 4 bajty pliku, ale jeśli nieskompresowany plik miał> 4 GB, wówczas wartość reprezentuje tylkouncompressed value modulo 2^32
Tę wartość można również odzyskać, uruchamiając gunzip -l foo.gz
, jednak kolumna „nieskompresowana” po prostu zawiera uncompressed value modulo 2^32
ponownie, prawdopodobnie podczas odczytu stopki, jak opisano powyżej.
Zastanawiałem się tylko, czy istnieje sposób na uzyskanie rozmiaru nieskompresowanego pliku bez konieczności jego pierwszej dekompresji, byłoby to szczególnie przydatne w przypadku, gdy pliki spakowane gzip zawierają ponad 50 GB danych i rozpakowanie ich przy użyciu metod takich jak gzcat foo.gz | wc -c
EDYCJA: Ograniczenie 4 GB jest otwarcie potwierdzone na man
stronie gzip
narzędzia dołączonego do OSX ( Apple gzip 242
)
BUGS
According to RFC 1952, the recorded file size is stored in a 32-bit
integer, therefore, it can not represent files larger than 4GB. This
limitation also applies to -l option of gzip utility.
źródło
gzip
musi być starsze niż wielu użytkowników w tej społeczności!gzip
wyszedł w 1992 roku. Byłbym zaskoczony, gdyby w okolicy kręciło się wielu 23-latków. Jestem pewien, że są takie, ale z tego, co mogę powiedzieć, mediana wieku to około 30-35 lat.xz
które nie mają tego ograniczenia. GNU przechodzi naxz
.xz
że „rozwiązałoby” ten problem.Odpowiedzi:
Uważam, że najszybszym sposobem jest modyfikacja
gzip
, aby testowanie w trybie pełnym wyświetlał liczbę zdekompresowanych bajtów; w moim systemie, z plikiem 7761108684-bajt, dostajęAby zmodyfikować gzip (1.6, dostępny w Debianie), łatka wygląda następująco:
źródło
-t
już zoptymalizowany pod tym względem? Ulepszenie jest wystarczająco małe, aby wyglądało na to, że zaoszczędziłeś tylko czas wyjściowy.gzip
; Po prostu uruchamiamgzip
skompresowane pliki, które nie kompresują ich, tylko je weryfikują. (Łata jest szybkim i brudnym sprawdzianem koncepcji, wymaga kilku dodatkowych zmian do pracygunzip
.)FCOMMENT
terenie. W ten sposób użytkownicy mogą zapytać o zakres bajtów, aby pobrać te dane. Byłoby to przydatne w moim przypadku, szczególnie w przypadku przedmiotów przechowywanych w Amazon S3Jeśli potrzebujesz wielkość skompresowanego pliku lub zestawu plików, najlepiej jest do stosowania
tar -z
lubtar -j
zamiastgzip
jakotar
obejmuje nieskompresowany format plików. Użyj,lesspipe
aby zerknąć na listę plików:Jeśli
less
jest skonfigurowany do użycialesspipe
:Pamiętaj jednak, że może to potrwać bardzo długo. Jednak twój system pozostaje responsywny, co pozwala zabić proces dekompresji.
Innym podejściem byłoby zalogowanie skompresowanego współczynnika i zapytanie tego pliku [tekstowego] zamiast:
Wymaga jednak obliczeń, aby znaleźć rzeczywisty rozmiar pliku.
Możesz również zrobić to samo z
tar
, co w rzeczywistości robię z kopiami zapasowymi o dużych rozmiarach, ponieważ zapobiega to przejściu przez cały proces dekompresji, aby uzyskać na przykład tylko rozmiar lub nazwę pliku.źródło
tar
masz oryginalny rozmiar pliku zalogowany w archiwum. Zzip
drugiej strony nie jestem pewien, czy zachowuje się inaczej.wc -c
polecenie.Co powiesz na
źródło
To zajmie dużo czasu, ale da ci ostateczny rozmiar w bajtach.
źródło