gzip: kompresja plików w Linuksie, rozpakowywanie gzip, gunzip i zcat

Środowisko testoweRodzina RHELAlmaLinux 9.8konto rootSprawdzono 2026-11-05
Polecenia kompresji · archiwizacjigzipgunzipzcatLokalizacja/usr/bin/gzip
Kompresja plików w Linuksie i rozpakowywanie gzip

gzip to polecenie Linuksa, które kompresuje jeden plik do pliku .gz; do rozpakowania dodaje się -d do tego samego polecenia albo używa gunzip. Na serwerze AlmaLinux 9 log dostępu o rozmiarze 31 878 bajtów zmniejszył się do 4424 bajtów, a po rozpakowaniu wróciły oryginalny rozmiar i czas modyfikacji.

Poniższe wyniki pochodzą z folderu testowego na serwerze AlmaLinux 9.8, uruchamianego na koncie root, a czas podano w UTC. Logi dostępu, notatki i pliki konfiguracyjne to przykładowe pliki utworzone na potrzeby testu, a adresy IP w logach to przykładowe wartości do dokumentacji.

1️⃣ Jak używać polecenia gzip

  • ↪️ Kompresja pliku z zachowaniem oryginału (-k)

W folderze testowym są dwa logi dostępu, dwa pliki notatek, folder config z plikami konfiguracyjnymi i pusty folder restore.

ls -l
total 88
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log
-rw-r--r-- 1 root root 47748 Oct 27 23:59 access.log-20261027
drwxr-xr-x 2 root root    39 Oct 29 00:19 config
-rw-r--r-- 1 root root    45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root   426 Oct 27 09:10 readme.txt
drwxr-xr-x 2 root root     6 Oct 29 00:19 restore

Po wpisaniu nazwy pliku za gzip ten plik zamienia się w skompresowany plik z .gz na końcu nazwy. Poniższe polecenie kompresuje access.log i po zakończeniu niczego nie wypisuje.

gzip access.log

Po kompresji ls -l nie pokazuje już access.log, tylko access.log.gz. Log o rozmiarze 31 878 bajtów ma teraz 4424 bajty, a czas modyfikacji pozostał taki jak w oryginalnym pliku.

ls -l access.log access.log.gz
ls: cannot access 'access.log': No such file or directory
-rw-r--r-- 1 root root 4424 Oct 28 23:50 access.log.gz

Z -v gzip pokazuje dla każdego pliku stopień zmniejszenia i nową nazwę pliku. [81.5%] w wierszu readme.txt to, o ile zmniejszył się oryginalny rozmiar, a [replaced with] oznacza, że oryginalny plik zastąpiono plikiem .gz.

gzip -v readme.txt
readme.txt:	 81.5% -- replaced with readme.txt.gz

Aby zachować oryginalny plik, dodaj -k. Po kompresji memo.txt z -k pliki memo.txt i memo.txt.gz zostają obok siebie.

gzip -k memo.txt
ls -l memo.txt memo.txt.gz
-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz

45-bajtowy memo.txt po kompresji wręcz urósł do 71 bajtów. Według oficjalnej dokumentacji gzip kompresuje nawet wtedy, gdy wynik jest większy od oryginału, i zapisuje w skompresowanym pliku oryginalną nazwę pliku oraz czas.

Po podaniu kilku plików naraz każdy dostaje własny plik .gz. Kompresja dwóch plików konfiguracyjnych z folderu config daje dwa pliki: app.conf.gz i site.conf.gz.

gzip -v config/app.conf config/site.conf
config/app.conf:	 78.7% -- replaced with config/app.conf.gz
config/site.conf:	 87.7% -- replaced with config/site.conf.gz
ls -l config/
total 8
-rw-r--r-- 1 root root 206 Oct 20 11:00 app.conf.gz
-rw-r--r-- 1 root root  93 Oct 20 11:05 site.conf.gz

2️⃣ Rozpakowywanie gzip

  • ↪️ gzip -d i gunzip, rozpakowywanie do innego folderu (-c)

Po rozpakowaniu access.log.gz z -d nic się nie wypisuje, access.log wraca, a access.log.gz znika.

gzip -d access.log.gz
ls -l access.log access.log.gz
ls: cannot access 'access.log.gz': No such file or directory
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log

Przywrócony access.log ma 31 878 bajtów, a czas modyfikacji jest taki sam jak przed kompresją: Oct 28 23:50.

gunzip robi to samo co gzip -d. Z -k rozpakowuje, zachowując skompresowany plik, a [created] w wierszu -v oznacza, że powstał nowy plik bez usuwania pliku .gz.

gunzip -kv readme.txt.gz
readme.txt.gz:	 81.5% -- created readme.txt
ls -l readme.txt readme.txt.gz
-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
-rw-r--r-- 1 root root 108 Oct 27 09:10 readme.txt.gz

gzip nie ma opcji wyboru folderu docelowego, więc aby rozpakować do innego folderu, wyślij rozpakowaną zawartość przez -c na standardowe wyjście i wpisz ścieżkę nowego pliku za [>]. Poniższe polecenie rozpakowuje memo.txt.gz do pliku memo.txt w folderze restore.

gzip -dc memo.txt.gz > restore/memo.txt
ls -l restore/
total 4
-rw-r--r-- 1 root root 45 Oct 29 00:19 memo.txt

Przy rozpakowaniu z -c plik memo.txt.gz zostaje na miejscu. Nowy restore/memo.txt ma czas modyfikacji Oct 29 00:19, czyli chwilę utworzenia pliku.

3️⃣ Opcje polecenia gzip

  • ↪️ -l, -t, poziom kompresji, -r

-l wypisuje w jednym wierszu, bez rozpakowywania, rozmiar po kompresji, oryginalny rozmiar, stopień zmniejszenia i nazwę po rozpakowaniu. Po ponownej kompresji access.log z -k sprawdzenie przez -l wygląda tak.

gzip -k access.log
gzip -l access.log.gz
         compressed        uncompressed  ratio uncompressed_name
               4424               31878  86.2% access.log

Z dodatkowym -v na początku pojawiają się metoda kompresji (defla, skrót od deflate), CRC oryginalnych danych oraz data i godzina oryginalnego pliku.

gzip -lv access.log.gz
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla b49b41c4 Oct 28 23:50                4424               31878  86.2% access.log

-t tylko sprawdza, czy skompresowany plik nie jest uszkodzony, i kończy działanie. Z -v za każdym poprawnym plikiem pojawia się [OK].

gzip -tv access.log.gz
access.log.gz:	 OK

Liczby od -1 do -9 to poziom kompresji, a według oficjalnej dokumentacji domyślny jest -6. Ten sam access.log skompresowano trzy razy z -c i porównano rozmiary przez wc -c.

gzip -c -1 access.log | wc -c
5564
gzip -c -6 access.log | wc -c
4424
gzip -c -9 access.log | wc -c
4164
Poziom kompresjiRozmiar .gzWzględem oryginału
Oryginalny plik (access.log)31 878 bajtów100%
-1 (najszybszy)5564 bajty17.5%
-6 (domyślny)4424 bajty13.9%
-9 (najmniejszy)4164 bajty13.1%

-9 był o 260 bajtów mniejszy od domyślnego, a -1 o 1140 bajtów większy od domyślnego.

Po podaniu samej nazwy folderu pojawia się [is a directory -- ignored], a folder zostaje pominięty.

gunzip config
gzip: config is a directory -- ignored

Aby przetworzyć wszystkie pliki w folderze, dodaj -r. Rozpakowanie przez gunzip -r folderu config, w którym skompresowano dwa pliki konfiguracyjne, rozpakowuje oba pliki po kolei.

gunzip -rv config
config/app.conf.gz:	 78.7% -- replaced with config/app.conf
config/site.conf.gz:	 87.7% -- replaced with config/site.conf
ls -l config/
total 8
-rw-r--r-- 1 root root 840 Oct 20 11:00 app.conf
-rw-r--r-- 1 root root 528 Oct 20 11:05 site.conf

-r kompresuje lub rozpakowuje pliki w folderze pojedynczo i nie łączy kilku plików w jeden. Folder w jeden skompresowany plik pakuje i jednocześnie kompresuje polecenie tar. Po spakowaniu folderu config przez tar -czf folder i oba pliki trafiają do jednego config.tar.gz.

tar -czf config.tar.gz config
tar -tzvf config.tar.gz
drwxr-xr-x root/root         0 2026-10-29 00:19 config/
-rw-r--r-- root/root       840 2026-10-20 11:00 config/app.conf
-rw-r--r-- root/root       528 2026-10-20 11:05 config/site.conf

📌 Główne opcje: wyniki z tego artykułu

OpcjaZadanieWynik w tym artykule
-cWysyła wynik na standardowe wyjście i zostawia oryginalny plik bez zmianWyjście -dc przekierowane do restore/memo.txt dało memo.txt o rozmiarze 45 bajtów
-dRozpakowanie (to samo co gunzip)access.log.gz znika, a access.log o rozmiarze 31878 bajtów wraca
-kZachowuje oryginalny plik po kompresji lub rozpakowaniumemo.txt (45 bajtów) i memo.txt.gz (71 bajtów) zostają obok siebie
-vWypisuje dla każdego pliku stopień zmniejszenia i nową nazwęreadme.txt: 81.5% -- replaced with readme.txt.gz
-lWypisuje listę z rozmiarem, stopniem i nazwą po rozpakowaniu skompresowanych plikówRozmiar po kompresji 4424, oryginalny rozmiar 31878, stopień 86.2%, nazwa access.log
-tSprawdza, czy skompresowany plik nie jest uszkodzonyZ -tv access.log.gz: OK, a dla broken.gz z uciętym końcem unexpected end of file
-rKompresuje lub rozpakowuje wszystkie pliki w folderzeJedno gunzip -rv config rozpakowało config/app.conf.gz i config/site.conf.gz
-fNadpisuje bez pytania, nawet gdy istnieje plik o tej samej nazwieNadpisano bez pytania: nie ma memo.txt, zostaje tylko memo.txt.gz (71 bajtów)
-1 ~ -9Poziom kompresji (-1 najszybszy, -9 najmniejszy, domyślnie -6)Wyjścia skompresowane z -1, -6 i -9 policzone przez wc -c: 5564, 4424, 4164

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
-NPrzy kompresji zapisuje oryginalną nazwę pliku i czas (domyślnie przy kompresji), a przy rozpakowaniu przywraca zapisaną nazwę i czas
-nPrzy kompresji nie zapisuje oryginalnej nazwy pliku ani czasu, a przy rozpakowaniu używa nazwy bez .gz (domyślnie przy rozpakowaniu)
-qNie wypisuje żadnych ostrzeżeń
-S przyrostekKompresuje z podanym przyrostkiem zamiast .gz, a przy rozpakowaniu najpierw szuka tego przyrostka
--rsyncableKompresuje tak, aby przy synchronizacji skompresowanych plików z innym serwerem przez rsync wysyłane były tylko zmienione części

🔲 Symulator polecenia gzip

W symulatorze poniżej możesz samodzielnie wpisać polecenia, aby skompresować plik przez gzip, rozpakować go i obejrzeć zawartość przez zcat i zgrep.

Symulator polecenia gzipgzip 1.12
[root@server work]#
Działa tylko w przeglądarce i nie kompresuje prawdziwych plików. Rozmiary po kompresji to zmierzone wartości, a dla treści utworzonej w symulatorze używane są wartości szacunkowe. Strzałki ↑↓ przywołują wcześniejsze polecenia.

4️⃣ Podgląd zawartości plików gzip

  • ↪️ zcat · zgrep

Starsze logi przechowywane z datą w nazwie zajmują mniej miejsca po kompresji przez gzip. Poniższe polecenie kompresuje access.log-20261027, czyli log z poprzedniego dnia.

gzip access.log-20261027

Skompresowany log można wypisać na ekran przez zcat bez rozpakowywania. zcat to to samo polecenie co gunzip -c (według oficjalnej dokumentacji), więc plik .gz zostaje na miejscu.

zcat access.log-20261027.gz | head -3
192.0.2.50 - - [27/Oct/2026:00:00:00 +0000] GET / HTTP/1.1 200 15929
192.0.2.54 - - [27/Oct/2026:00:00:07 +0000] GET / HTTP/1.1 200 17699
192.0.2.4 - - [27/Oct/2026:00:00:14 +0000] GET / HTTP/1.1 200 13813

Wyjście zcat można przekazać potokiem do innych poleceń, a po policzeniu przez wc -l ten log ma 600 wierszy.

zcat access.log-20261027.gz | wc -l
600

Aby znaleźć konkretny tekst w skompresowanym logu, użyj zgrep. Z -c pojawia się tylko liczba wierszy zawierających [ 404 ]; aby zobaczyć same wiersze, uruchom polecenie bez -c.

zgrep -c ' 404 ' access.log-20261027.gz
37
zgrep ' 404 ' access.log-20261027.gz | head -3
192.0.2.23 - - [27/Oct/2026:00:02:06 +0000] GET /old-page-6/ HTTP/1.1 404 229
192.0.2.38 - - [27/Oct/2026:00:04:40 +0000] GET /old-page-2/ HTTP/1.1 404 217
192.0.2.22 - - [27/Oct/2026:00:07:42 +0000] GET /old-page-6/ HTTP/1.1 404 414

Gdy zcat dostaje nieskompresowany plik, wypisuje [not in gzip format] i się zatrzymuje.

zcat access.log | head -1

gzip: access.log: not in gzip format

zgrep czyta też nieskompresowane pliki bez zmian, więc można jednocześnie przeszukać bieżący log i skompresowane starsze logi. Przy dwóch lub więcej plikach przed liczbą wierszy pojawia się nazwa pliku.

zgrep -c wp-login.php access.log access.log-20261027.gz
access.log:36
access.log-20261027.gz:52

5️⃣ Błędy gzip

  • ↪️ not in gzip format i unexpected end of file

Ponowna kompresja pliku, który już kończy się na .gz, wypisuje [already has .gz suffix -- unchanged], a plik zostaje bez zmian.

gzip access.log.gz
gzip: access.log.gz already has .gz suffix -- unchanged

Odwrotnie, rozpakowanie przez -d pliku, który nie kończy się na .gz, wypisuje [unknown suffix -- ignored].

gzip -d memo.txt
gzip: memo.txt: unknown suffix -- ignored

Plik, który tylko nazywa się .gz, ale nie został skompresowany przez gzip, kończy się komunikatem [not in gzip format]. Ten komunikat pojawił się po skopiowaniu pliku tekstowego memo.txt pod nazwą notgzip.gz i próbie rozpakowania.

cp memo.txt notgzip.gz
gzip -d notgzip.gz

gzip: notgzip.gz: not in gzip format

Plik .gz z uciętym końcem, na przykład po przerwanym pobieraniu, kończy się komunikatem [unexpected end of file]. To wynik sprawdzenia przez -t pliku broken.gz, w którym zostawiono tylko pierwsze 2000 bajtów skompresowanego starszego logu.

head -c 2000 access.log-20261027.gz > broken.gz
gzip -t broken.gz

gzip: broken.gz: unexpected end of file

Nawet z uciętego pliku zcat wydobywa zawartość aż do miejsca przerwania. Z 600-wierszowego logu w restore/broken.log zostały 162 wiersze, a oficjalna dokumentacja także zaleca ratowanie początku uszkodzonego skompresowanego pliku przez zcat.

zcat broken.gz > restore/broken.log
wc -l restore/broken.log

gzip: broken.gz: unexpected end of file
162 restore/broken.log

Jeśli plik o tej samej nazwie co tworzony plik .gz już istnieje, gzip pyta, czy go nadpisać. Po wpisaniu n polecenie kończy się komunikatem [not overwritten] i niczego nie zmienia.

gzip memo.txt
gzip: memo.txt.gz already exists; do you wish to overwrite (y or n)? n
	not overwritten

Z -f gzip od razu nadpisuje bez pytania. Ponieważ nie dodano -k, memo.txt znika i zostaje tylko memo.txt.gz.

gzip -f memo.txt
ls -l memo.txt memo.txt.gz
ls: cannot access 'memo.txt': No such file or directory
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz

Komunikaty błędów, które pojawiły się przy pracy z kompresją, i to, co sprawdzić dalej, wyglądają tak.

WynikZnaczenieCo sprawdzić dalej
already has .gz suffix -- unchangedPlik już kończy się na .gz, więc nie jest kompresowany ponownieCzy podano nazwę oryginalnego pliku do kompresji
unknown suffix -- ignoredPróba rozpakowania pliku, który nie kończy się na .gzNazwa pliku .gz w ls
not in gzip formatNazwa kończy się na .gz, ale plik nie został skompresowany przez gzipRzeczywisty format (zip, tar) i pasujące polecenie
unexpected end of fileKoniec skompresowanego pliku jest uciętyPorównanie rozmiaru z oryginałem i ponowne pobranie · ratowanie początku przez zcat
already exists; do you wish to overwritePlik o nazwie tworzonego pliku już istniejey lub -f, jeśli można nadpisać · -c z inną nazwą, aby zachować
is a directory -- ignoredPodano nazwę folderu zamiast pliku-r dla plików w folderze · tar, aby połączyć je w jeden

🔢 FAQ & polecane treści

Folder config spakowano przez tar do x.tar, skompresowano przez gzip -v i rozpakowano przez gunzip -v: zdjęta została tylko warstwa .gz, a został x.tar o rozmiarze 10 240 bajtów. Aby wydobyć spakowane pliki, trzeba go jeszcze raz rozpakować przez tar. Po ponownej kompresji x.tar.gz i rozpakowaniu przez tar -xzf do folderu restore/t folder config i oba pliki konfiguracyjne pojawiły się za jednym razem.

Plik o rozmiarze 28 648 800 bajtów, złożony z tego samego logu dostępu połączonego 600 razy, skompresowano dwukrotnie na każdym poziomie. -1 zajął około 0,3 sekundy i dał 4 821 317 bajtów, domyślny -6 około 0,65 sekundy i 3 625 500 bajtów, a -9 około 2,5 sekundy i 3 376 224 bajty. -9 był o około 7% mniejszy niż -6, ale trwał prawie cztery razy dłużej.

gzip przy kompresji zapisuje w pliku .gz oryginalną nazwę pliku. Po skopiowaniu readme.txt.gz do folderu restore jako backup-1.gz gzip -lN pokazał zapisaną nazwę readme.txt, a gunzip -N utworzył restore/readme.txt. Bez -N nazwą staje się nazwa pliku bez .gz (według oficjalnej dokumentacji).

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 2   +   8   =