gzip: сжатие файлов в Linux, распаковка gzip, как пользоваться gunzip и zcat
gzip — это команда Linux, которая сжимает один файл в файл .gz; чтобы распаковать его, добавьте к той же команде -d или используйте gunzip. На сервере AlmaLinux 9 журнал доступа размером 31 878 байт после сжатия уменьшился до 4424 байт, а после распаковки вернулись исходный размер и время изменения.
Вывод ниже получен в тестовой папке на сервере AlmaLinux 9.8 под учётной записью root, время указано в UTC. Журналы доступа, заметки и файлы настроек — это примерные файлы, созданные для теста, а IP-адреса в журналах — примерные значения для документации.
1️⃣ Как пользоваться командой gzip
В тестовой папке лежат два журнала доступа, два файла заметок, папка config с файлами настроек и пустая папка 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 restoreЕсли указать имя файла после gzip, этот файл превратится в сжатый файл с .gz в конце имени. Команда ниже сжимает access.log и по завершении ничего не выводит.
gzip access.logПосле сжатия ls -l показывает не access.log, а только access.log.gz. Журнал размером 31 878 байт стал 4424 байт, а время изменения осталось как у исходного файла.
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.gzС -v gzip выводит для каждого файла степень сжатия и новое имя файла. [81.5%] в строке readme.txt — насколько уменьшился исходный размер, а [replaced with] означает, что исходный файл заменён файлом .gz.
gzip -v readme.txtreadme.txt: 81.5% -- replaced with readme.txt.gzЧтобы сохранить исходный файл, добавьте -k. Если сжать memo.txt с -k, рядом останутся memo.txt и memo.txt.gz.
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.gzmemo.txt размером 45 байт после сжатия даже вырос до 71 байт. По официальному руководству, gzip сжимает, даже если результат больше оригинала, и сохраняет внутри сжатого файла исходное имя и время файла.
Если указать несколько файлов сразу, для каждого создаётся свой файл .gz. При сжатии двух файлов настроек из папки config получаются два файла: app.conf.gz и 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️⃣ Распаковка gzip
При распаковке access.log.gz с -d ничего не выводится, access.log появляется снова, а access.log.gz не остаётся.
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.logВосстановленный access.log имеет размер 31 878 байт, а время изменения то же, что до сжатия: Oct 28 23:50.
gunzip делает то же, что gzip -d. С -k он распаковывает, сохраняя сжатый файл, а [created] в строке -v означает, что создан новый файл без удаления файла .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.gzУ gzip нет параметра для выбора папки назначения, поэтому для распаковки в другую папку отправьте распакованное содержимое в стандартный вывод с помощью -c и укажите путь нового файла после [>]. Команда ниже распаковывает memo.txt.gz в файл memo.txt в папке 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.txtПри распаковке с -c memo.txt.gz остаётся на месте. Время изменения нового restore/memo.txt — Oct 29 00:19, момент создания файла.
3️⃣ Параметры команды gzip
-l без распаковки выводит в одну строку размер после сжатия, исходный размер, степень сжатия и имя после распаковки. Если снова сжать access.log с -k и проверить через -l, получится следующее.
gzip -k access.loggzip -l access.log.gz compressed uncompressed ratio uncompressed_name
4424 31878 86.2% access.logЕсли добавить -v, впереди появятся метод сжатия (defla — сокращение от deflate), CRC исходных данных, а также дата и время исходного файла.
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 только проверяет, не повреждён ли сжатый файл, и завершает работу. Вместе с -v после каждого исправного файла выводится [OK].
gzip -tv access.log.gzaccess.log.gz: OKЧисла от -1 до -9 задают уровень сжатия, и по официальному руководству по умолчанию используется -6. Один и тот же access.log сжали три раза с -c и сравнили размеры через wc -c.
gzip -c -1 access.log | wc -c5564gzip -c -6 access.log | wc -c4424gzip -c -9 access.log | wc -c4164| Уровень сжатия | Размер .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 configgzip: config is a directory -- ignoredЧтобы обработать все файлы в папке, добавьте -r. При распаковке через gunzip -r папки config, где были сжаты два файла настроек, оба файла распаковываются по очереди.
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 сжимает или распаковывает файлы в папке по одному и не объединяет несколько файлов в один. Папку в один сжатый файл упаковывает и одновременно сжимает команда tar. Если сжать папку config через tar -czf, папка и оба файла окажутся в одном 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📌 Основные опции: результаты из этой статьи
| Опция | Назначение | Результат в этой статье | |
|---|---|---|---|
| -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.
4️⃣ Просмотр содержимого файлов gzip
Старые журналы, сохранённые с датой в имени, занимают меньше места, если сжать их через gzip. Команда ниже сжимает access.log-20261027 — журнал за предыдущий день.
gzip access.log-20261027Сжатый журнал можно вывести на экран через zcat без распаковки. zcat — та же команда, что gunzip -c (по официальному руководству), поэтому файл .gz остаётся на месте.
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 13813Вывод zcat можно передать другим командам через конвейер, и если посчитать через wc -l, в этом журнале 600 строк.
zcat access.log-20261027.gz | wc -l600Чтобы найти определённый текст в сжатом журнале, используйте zgrep. С -c выводится только число строк, содержащих [ 404 ]; чтобы увидеть сами строки, запустите без -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 414Если zcat получает несжатый файл, он выводит [not in gzip format] и останавливается.
zcat access.log | head -1
gzip: access.log: not in gzip formatzgrep читает и несжатые файлы как есть, поэтому можно за один раз искать в текущем журнале и в сжатых старых журналах. Если указать два файла или больше, перед числом строк появится имя файла.
zgrep -c wp-login.php access.log access.log-20261027.gzaccess.log:36
access.log-20261027.gz:525️⃣ Ошибки gzip
Если снова сжать файл, который уже оканчивается на .gz, появится [already has .gz suffix -- unchanged], и файл останется без изменений.
gzip access.log.gzgzip: access.log.gz already has .gz suffix -- unchangedИ наоборот, если распаковать через -d файл, который не оканчивается на .gz, появится [unknown suffix -- ignored].
gzip -d memo.txtgzip: memo.txt: unknown suffix -- ignoredФайл, у которого только имя .gz, но который не был сжат через gzip, завершается сообщением [not in gzip format]. Это сообщение появилось, когда текстовый файл memo.txt скопировали под именем notgzip.gz и попытались распаковать.
cp memo.txt notgzip.gzgzip -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.gzgzip -t broken.gz
gzip: broken.gz: unexpected end of fileДаже из обрезанного файла zcat может извлечь содержимое до места обрыва. Из журнала в 600 строк в restore/broken.log осталось 162 строки, и официальное руководство тоже советует спасать начало повреждённого сжатого файла через zcat.
zcat broken.gz > restore/broken.logwc -l restore/broken.log
gzip: broken.gz: unexpected end of file
162 restore/broken.logЕсли файл с тем же именем, что и создаваемый .gz, уже существует, gzip спрашивает, перезаписать ли его. Если ввести n, команда завершится с [not overwritten] и ничего не изменит.
gzip memo.txtgzip: 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.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.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 & рекомендуемые материалы
Поиск
Команда grep в Linux
Команда grep для поиска строки в текстовых файлах, например в журналах, с примерами её связки с tail и find через конвейер.
Диск
Команда du: проверка места на диске
Команда du для проверки того, сколько места на диске занимают файлы и каталоги.
Просмотр файлов
Команды head и tail в Linux
Команды head и tail для просмотра первых и последних строк файла, часто используются для проверки журналов доступа сервера.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.