gzip: kompresja plików w Linuksie, rozpakowywanie gzip, gunzip i zcat
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
W folderze testowym są dwa logi dostępu, dwa pliki notatek, folder config z plikami konfiguracyjnymi i pusty folder restore.
ls -ltotal 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 restorePo 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.logPo 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.gzls: cannot access 'access.log': No such file or directory
-rw-r--r-- 1 root root 4424 Oct 28 23:50 access.log.gzZ -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.txtreadme.txt: 81.5% -- replaced with readme.txt.gzAby zachować oryginalny plik, dodaj -k. Po kompresji memo.txt z -k pliki memo.txt i memo.txt.gz zostają obok siebie.
gzip -k memo.txtls -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.gz45-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.confconfig/app.conf: 78.7% -- replaced with config/app.conf.gz
config/site.conf: 87.7% -- replaced with config/site.conf.gzls -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.gz2️⃣ Rozpakowywanie gzip
Po rozpakowaniu access.log.gz z -d nic się nie wypisuje, access.log wraca, a access.log.gz znika.
gzip -d access.log.gzls -l access.log access.log.gzls: cannot access 'access.log.gz': No such file or directory
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.logPrzywró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.gzreadme.txt.gz: 81.5% -- created readme.txtls -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.gzgzip 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.txtls -l restore/total 4
-rw-r--r-- 1 root root 45 Oct 29 00:19 memo.txtPrzy 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 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.loggzip -l access.log.gz compressed uncompressed ratio uncompressed_name
4424 31878 86.2% access.logZ 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.gzmethod 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.gzaccess.log.gz: OKLiczby 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 -c5564gzip -c -6 access.log | wc -c4424gzip -c -9 access.log | wc -c4164| Poziom kompresji | Rozmiar .gz | Względem oryginału |
|---|---|---|
| Oryginalny plik (access.log) | 31 878 bajtów | 100% |
| -1 (najszybszy) | 5564 bajty | 17.5% |
| -6 (domyślny) | 4424 bajty | 13.9% |
| -9 (najmniejszy) | 4164 bajty | 13.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 configgzip: config is a directory -- ignoredAby 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 configconfig/app.conf.gz: 78.7% -- replaced with config/app.conf
config/site.conf.gz: 87.7% -- replaced with config/site.confls -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 configtar -tzvf config.tar.gzdrwxr-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
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| -c | Wysyła wynik na standardowe wyjście i zostawia oryginalny plik bez zmian | Wyjście -dc przekierowane do restore/memo.txt dało memo.txt o rozmiarze 45 bajtów | |
| -d | Rozpakowanie (to samo co gunzip) | access.log.gz znika, a access.log o rozmiarze 31878 bajtów wraca | |
| -k | Zachowuje oryginalny plik po kompresji lub rozpakowaniu | memo.txt (45 bajtów) i memo.txt.gz (71 bajtów) zostają obok siebie | |
| -v | Wypisuje dla każdego pliku stopień zmniejszenia i nową nazwę | readme.txt: 81.5% -- replaced with readme.txt.gz | |
| -l | Wypisuje listę z rozmiarem, stopniem i nazwą po rozpakowaniu skompresowanych plików | Rozmiar po kompresji 4424, oryginalny rozmiar 31878, stopień 86.2%, nazwa access.log | |
| -t | Sprawdza, czy skompresowany plik nie jest uszkodzony | Z -tv access.log.gz: OK, a dla broken.gz z uciętym końcem unexpected end of file | |
| -r | Kompresuje lub rozpakowuje wszystkie pliki w folderze | Jedno gunzip -rv config rozpakowało config/app.conf.gz i config/site.conf.gz | |
| -f | Nadpisuje bez pytania, nawet gdy istnieje plik o tej samej nazwie | Nadpisano bez pytania: nie ma memo.txt, zostaje tylko memo.txt.gz (71 bajtów) | |
| -1 ~ -9 | Poziom 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
| Opcja | Zadanie | |
|---|---|---|
| -N | Przy kompresji zapisuje oryginalną nazwę pliku i czas (domyślnie przy kompresji), a przy rozpakowaniu przywraca zapisaną nazwę i czas | |
| -n | Przy kompresji nie zapisuje oryginalnej nazwy pliku ani czasu, a przy rozpakowaniu używa nazwy bez .gz (domyślnie przy rozpakowaniu) | |
| -q | Nie wypisuje żadnych ostrzeżeń | |
| -S przyrostek | Kompresuje z podanym przyrostkiem zamiast .gz, a przy rozpakowaniu najpierw szuka tego przyrostka | |
| --rsyncable | Kompresuje 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.
4️⃣ Podgląd zawartości plików gzip
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-20261027Skompresowany 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 -3192.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 13813Wyjś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 -l600Aby 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.gz37zgrep ' 404 ' access.log-20261027.gz | head -3192.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 414Gdy zcat dostaje nieskompresowany plik, wypisuje [not in gzip format] i się zatrzymuje.
zcat access.log | head -1
gzip: access.log: not in gzip formatzgrep 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.gzaccess.log:36
access.log-20261027.gz:525️⃣ Błędy gzip
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.gzgzip: access.log.gz already has .gz suffix -- unchangedOdwrotnie, rozpakowanie przez -d pliku, który nie kończy się na .gz, wypisuje [unknown suffix -- ignored].
gzip -d memo.txtgzip: memo.txt: unknown suffix -- ignoredPlik, 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.gzgzip -d notgzip.gz
gzip: notgzip.gz: not in gzip formatPlik .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.gzgzip -t broken.gz
gzip: broken.gz: unexpected end of fileNawet 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.logwc -l restore/broken.log
gzip: broken.gz: unexpected end of file
162 restore/broken.logJeś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.txtgzip: memo.txt.gz already exists; do you wish to overwrite (y or n)? n
not overwrittenZ -f gzip od razu nadpisuje bez pytania. Ponieważ nie dodano -k, memo.txt znika i zostaje tylko memo.txt.gz.
gzip -f memo.txtls -l memo.txt memo.txt.gzls: cannot access 'memo.txt': No such file or directory
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gzKomunikaty błędów, które pojawiły się przy pracy z kompresją, i to, co sprawdzić dalej, wyglądają tak.
| Wynik | Znaczenie | Co sprawdzić dalej |
|---|---|---|
| already has .gz suffix -- unchanged | Plik już kończy się na .gz, więc nie jest kompresowany ponownie | Czy podano nazwę oryginalnego pliku do kompresji |
| unknown suffix -- ignored | Próba rozpakowania pliku, który nie kończy się na .gz | Nazwa pliku .gz w ls |
| not in gzip format | Nazwa kończy się na .gz, ale plik nie został skompresowany przez gzip | Rzeczywisty format (zip, tar) i pasujące polecenie |
| unexpected end of file | Koniec skompresowanego pliku jest ucięty | Porównanie rozmiaru z oryginałem i ponowne pobranie · ratowanie początku przez zcat |
| already exists; do you wish to overwrite | Plik o nazwie tworzonego pliku już istnieje | y lub -f, jeśli można nadpisać · -c z inną nazwą, aby zachować |
| is a directory -- ignored | Podano nazwę folderu zamiast pliku | -r dla plików w folderze · tar, aby połączyć je w jeden |
🔢 FAQ & polecane treści
Szukaj
Polecenie grep w Linuksie
Polecenie grep do szukania ciągu znaków w plikach tekstowych, takich jak logi, z przykładami łączenia go potokiem z tail i find.
Dysk
Polecenie du: sprawdzanie miejsca zajmowanego przez pliki
Polecenie du do sprawdzania, ile miejsca na dysku zajmują pliki i katalogi.
Podgląd plików
Polecenia head i tail w Linuksie
Polecenia head i tail do podglądu pierwszych i ostatnich wierszy pliku, często używane do sprawdzania logów dostępu serwera.
ℹ️ 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.