gzip: сжатие файлов в Linux, распаковка gzip, как пользоваться gunzip и zcat

Тестовая средаСемейство RHELAlmaLinux 9.8Учётная запись rootПроверено 2026-11-05
Команды сжатия · архивированияgzipgunzipzcatРасположение/usr/bin/gzip
Сжатие файлов в Linux и распаковка gzip

gzip — это команда Linux, которая сжимает один файл в файл .gz; чтобы распаковать его, добавьте к той же команде -d или используйте gunzip. На сервере AlmaLinux 9 журнал доступа размером 31 878 байт после сжатия уменьшился до 4424 байт, а после распаковки вернулись исходный размер и время изменения.

Вывод ниже получен в тестовой папке на сервере AlmaLinux 9.8 под учётной записью root, время указано в UTC. Журналы доступа, заметки и файлы настроек — это примерные файлы, созданные для теста, а IP-адреса в журналах — примерные значения для документации.

1️⃣ Как пользоваться командой gzip

  • ↪️ Сжатие файла с сохранением оригинала (-k)

В тестовой папке лежат два журнала доступа, два файла заметок, папка config с файлами настроек и пустая папка 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

Если указать имя файла после gzip, этот файл превратится в сжатый файл с .gz в конце имени. Команда ниже сжимает access.log и по завершении ничего не выводит.

gzip access.log

После сжатия ls -l показывает не access.log, а только access.log.gz. Журнал размером 31 878 байт стал 4424 байт, а время изменения осталось как у исходного файла.

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

С -v gzip выводит для каждого файла степень сжатия и новое имя файла. [81.5%] в строке readme.txt — насколько уменьшился исходный размер, а [replaced with] означает, что исходный файл заменён файлом .gz.

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

Чтобы сохранить исходный файл, добавьте -k. Если сжать memo.txt с -k, рядом останутся memo.txt и memo.txt.gz.

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

memo.txt размером 45 байт после сжатия даже вырос до 71 байт. По официальному руководству, gzip сжимает, даже если результат больше оригинала, и сохраняет внутри сжатого файла исходное имя и время файла.

Если указать несколько файлов сразу, для каждого создаётся свой файл .gz. При сжатии двух файлов настроек из папки config получаются два файла: app.conf.gz и 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️⃣ Распаковка gzip

  • ↪️ gzip -d и gunzip, распаковка в другую папку (-c)

При распаковке access.log.gz с -d ничего не выводится, access.log появляется снова, а access.log.gz не остаётся.

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

Восстановленный access.log имеет размер 31 878 байт, а время изменения то же, что до сжатия: Oct 28 23:50.

gunzip делает то же, что gzip -d. С -k он распаковывает, сохраняя сжатый файл, а [created] в строке -v означает, что создан новый файл без удаления файла .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 нет параметра для выбора папки назначения, поэтому для распаковки в другую папку отправьте распакованное содержимое в стандартный вывод с помощью -c и укажите путь нового файла после [>]. Команда ниже распаковывает memo.txt.gz в файл memo.txt в папке 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

При распаковке с -c memo.txt.gz остаётся на месте. Время изменения нового restore/memo.txt — Oct 29 00:19, момент создания файла.

3️⃣ Параметры команды gzip

  • ↪️ -l, -t, уровень сжатия, -r

-l без распаковки выводит в одну строку размер после сжатия, исходный размер, степень сжатия и имя после распаковки. Если снова сжать access.log с -k и проверить через -l, получится следующее.

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

Если добавить -v, впереди появятся метод сжатия (defla — сокращение от deflate), CRC исходных данных, а также дата и время исходного файла.

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 только проверяет, не повреждён ли сжатый файл, и завершает работу. Вместе с -v после каждого исправного файла выводится [OK].

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

Числа от -1 до -9 задают уровень сжатия, и по официальному руководству по умолчанию используется -6. Один и тот же access.log сжали три раза с -c и сравнили размеры через 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
Уровень сжатияРазмер .gzОт исходного размера
Исходный файл (access.log)31 878 байт100%
-1 (самый быстрый)5564 байта17.5%
-6 (по умолчанию)4424 байта13.9%
-9 (самый маленький)4164 байта13.1%

-9 оказался на 260 байт меньше уровня по умолчанию, а -1 — на 1140 байт больше.

Если указать только имя папки, появится [is a directory -- ignored], и папка будет пропущена.

gunzip config
gzip: config is a directory -- ignored

Чтобы обработать все файлы в папке, добавьте -r. При распаковке через gunzip -r папки config, где были сжаты два файла настроек, оба файла распаковываются по очереди.

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 сжимает или распаковывает файлы в папке по одному и не объединяет несколько файлов в один. Папку в один сжатый файл упаковывает и одновременно сжимает команда tar. Если сжать папку config через tar -czf, папка и оба файла окажутся в одном 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

📌 Основные опции: результаты из этой статьи

ОпцияНазначениеРезультат в этой статье
-cОтправляет результат в стандартный вывод и оставляет исходный файл без измененийВывод -dc, направленный в restore/memo.txt, создал memo.txt размером 45 байт
-dРаспаковка (то же, что gunzip)access.log.gz исчезает, и access.log размером 31878 байт возвращается
-kСохраняет исходный файл после сжатия или распаковкиmemo.txt (45 байт) и memo.txt.gz (71 байт) остаются рядом
-vВыводит для каждого файла степень сжатия и новое имяreadme.txt: 81.5% -- replaced with readme.txt.gz
-lВыводит список с размером, степенью сжатия и именем после распаковки сжатых файловРазмер после сжатия 4424, исходный размер 31878, степень 86.2%, имя access.log
-tПроверяет, не повреждён ли сжатый файлС -tv access.log.gz: OK, а для broken.gz с обрезанным концом — unexpected end of file
-rСжимает или распаковывает все файлы в папкеОдин gunzip -rv config распаковал config/app.conf.gz и config/site.conf.gz
-fПерезаписывает без вопроса, даже если есть файл с тем же именемПерезаписано без вопроса: memo.txt нет, остался только memo.txt.gz (71 байт)
-1 ~ -9Уровень сжатия (-1 самый быстрый, -9 самый маленький, по умолчанию -6)Вывод, сжатый с -1, -6 и -9, посчитанный через wc -c: 5564, 4424, 4164

📎 Другие опции: по официальному руководству

ОпцияНазначение
-NПри сжатии сохраняет исходное имя файла и время (по умолчанию при сжатии), а при распаковке восстанавливает сохранённые имя и время
-nПри сжатии не сохраняет исходное имя файла и время, а при распаковке использует имя без .gz (по умолчанию при распаковке)
-qНе выводит никаких предупреждений
-S СУФФИКССжимает с указанным суффиксом вместо .gz, а при распаковке сначала ищет этот суффикс
--rsyncableСжимает так, чтобы при синхронизации сжатых файлов с другим сервером через rsync передавались только изменённые части

🔲 Симулятор команды gzip

В симуляторе ниже можно самостоятельно ввести команды: сжать файл через gzip, распаковать его и посмотреть содержимое через zcat и zgrep.

Симулятор команды gzipgzip 1.12
[root@server work]#
Работает только в браузере и не сжимает настоящие файлы. Размеры после сжатия — измеренные значения, а для содержимого, созданного в симуляторе, используются оценочные. Клавиши ↑↓ вызывают предыдущие команды.

4️⃣ Просмотр содержимого файлов gzip

  • ↪️ zcat · zgrep

Старые журналы, сохранённые с датой в имени, занимают меньше места, если сжать их через gzip. Команда ниже сжимает access.log-20261027 — журнал за предыдущий день.

gzip access.log-20261027

Сжатый журнал можно вывести на экран через zcat без распаковки. zcat — та же команда, что gunzip -c (по официальному руководству), поэтому файл .gz остаётся на месте.

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

Вывод zcat можно передать другим командам через конвейер, и если посчитать через wc -l, в этом журнале 600 строк.

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

Чтобы найти определённый текст в сжатом журнале, используйте zgrep. С -c выводится только число строк, содержащих [ 404 ]; чтобы увидеть сами строки, запустите без -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

Если zcat получает несжатый файл, он выводит [not in gzip format] и останавливается.

zcat access.log | head -1

gzip: access.log: not in gzip format

zgrep читает и несжатые файлы как есть, поэтому можно за один раз искать в текущем журнале и в сжатых старых журналах. Если указать два файла или больше, перед числом строк появится имя файла.

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

5️⃣ Ошибки gzip

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

Если снова сжать файл, который уже оканчивается на .gz, появится [already has .gz suffix -- unchanged], и файл останется без изменений.

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

И наоборот, если распаковать через -d файл, который не оканчивается на .gz, появится [unknown suffix -- ignored].

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

Файл, у которого только имя .gz, но который не был сжат через gzip, завершается сообщением [not in gzip format]. Это сообщение появилось, когда текстовый файл memo.txt скопировали под именем notgzip.gz и попытались распаковать.

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

gzip: notgzip.gz: not in gzip format

Файл .gz с обрезанным концом, например из-за прерванной загрузки, завершается сообщением [unexpected end of file]. Это результат проверки через -t файла broken.gz, в котором оставили только первые 2000 байт сжатого старого журнала.

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

gzip: broken.gz: unexpected end of file

Даже из обрезанного файла zcat может извлечь содержимое до места обрыва. Из журнала в 600 строк в restore/broken.log осталось 162 строки, и официальное руководство тоже советует спасать начало повреждённого сжатого файла через zcat.

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

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

Если файл с тем же именем, что и создаваемый .gz, уже существует, gzip спрашивает, перезаписать ли его. Если ввести n, команда завершится с [not overwritten] и ничего не изменит.

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

С -f gzip перезаписывает сразу, не спрашивая. Так как -k не добавлен, memo.txt исчезает, и остаётся только 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

Ниже — сообщения об ошибках, которые появлялись при работе со сжатием, и что проверить дальше.

ВыводНазначениеЧто проверить дальше
already has .gz suffix -- unchangedФайл уже оканчивается на .gz, поэтому повторно не сжимаетсяУказано ли имя исходного файла для сжатия
unknown suffix -- ignoredПопытка распаковать файл, который не оканчивается на .gzИмя файла .gz через ls
not in gzip formatИмя оканчивается на .gz, но файл сжат не через gzipРеальный формат (zip, tar) и подходящая команда
unexpected end of fileКонец сжатого файла обрезанСравнить размер с оригиналом и скачать заново · спасти начало через zcat
already exists; do you wish to overwriteФайл с тем же именем, что и создаваемый, уже существуетy или -f, если можно перезаписать · -c с другим именем, чтобы сохранить
is a directory -- ignoredУказано имя папки вместо файла-r для файлов в папке · tar, чтобы объединить их в один

🔢 FAQ & рекомендуемые материалы

Папку config упаковали через tar в x.tar, сжали через gzip -v и распаковали через gunzip -v: снялся только слой .gz, и остался x.tar размером 10 240 байт. Чтобы достать упакованные файлы, его нужно ещё раз распаковать через tar. Когда заново сжатый x.tar.gz распаковали через tar -xzf в папку restore/t, папка config и оба файла настроек появились за один раз.

Файл размером 28 648 800 байт, составленный из одного и того же журнала доступа, повторённого 600 раз, сжали дважды на каждом уровне. -1 занял около 0,3 секунды и дал 4 821 317 байт, -6 по умолчанию — около 0,65 секунды и 3 625 500 байт, а -9 — около 2,5 секунды и 3 376 224 байта. -9 оказался примерно на 7% меньше -6, но работал почти в четыре раза дольше.

При сжатии gzip сохраняет исходное имя файла внутри .gz. После копирования readme.txt.gz в папку restore под именем backup-1.gz команда gzip -lN показала сохранённое имя readme.txt, а gunzip -N создала restore/readme.txt. Без -N именем становится имя файла без .gz (по официальному руководству).

🪐ИсточникиОфициальная документация

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 3   +   5   =