← Весь справочник

gzip

Сжатие отдельных файлов — gzip, gunzip, zcat, zgrep; коротко про xz и bzip2

gzip сжимает каждый файл по отдельности и заменяет его на файл.gz. Каталоги он не упаковывает — для этого сначала собирают архив через tar, а потом сжимают (tar -czf). Для чтения сжатых файлов без распаковки есть zcat, zless, zgrep. Формат .gz — самый распространённый: в нём ротируются логи, отдаются дампы и архивы.

Синтаксис

gzip [опции] [файл…]        # сжать: файл → файл.gz; без файлов — stdin → stdout
gunzip [опции] файл.gz…     # распаковать (то же, что gzip -d)
zcat файл.gz…               # вывести распакованное содержимое в stdout

Что делать

ОпцияЧто делает
(без опций)сжать файл и удалить оригинал
-dраспаковать (как gunzip)
-cписать результат в stdout, исходный файл не трогать
-tпроверить целостность: молчит, если всё в порядке, код 0
-lпоказать размер до и после и степень сжатия

Как сжимать

ОпцияЧто делает
-1 … -9уровень: -1 (--fast) быстрее, -9 (--best) сильнее; по умолчанию -6
-kсохранить исходный файл рядом с .gz
-fперезаписать существующий .gz; сжимать файлы с жёсткими ссылками и по символическим ссылкам
-rобработать каждый файл в каталоге рекурсивно (каталог остаётся каталогом)
-S .zиспользовать другой суффикс вместо .gz (и при распаковке тоже)
-n / -Nне сохранять / сохранять и при распаковке восстанавливать исходное имя и время файла
--rsyncableсжимать так, чтобы rsync передавал только изменившиеся части
-v / -qподробно (с процентом сжатия) / молча

Вывод gzip -l

         compressed        uncompressed  ratio uncompressed_name
             215163              588895  63.5% access.log

Размер после сжатия, до сжатия (в байтах), какая доля сэкономлена и имя после распаковки. С -v добавляются метод, CRC и дата.

Утилиты для .gz

КомандаЧто делает
zcatкак cat; zcat -f выводит и несжатые файлы как есть
zless / zmoreлистать сжатый файл
zgrepgrep по сжатым файлам, принимает те же опции (-i, -c, -l, -h)
zdiff / zcmpdiff / cmp двух сжатых файлов

xz и bzip2

xz (.xz) сжимает заметно сильнее, но медленнее. bzip2 (.bz2) — старый формат между gzip и xz по степени сжатия; в минимальных образах его часто нет, и «bzip2: not found» значит, что пакет не установлен.

xzЧто делает
xz файл / unxz файл.xzсжать / распаковать; опции -k, -d, -c, -f, -t, -v — как у gzip
-0 … -9, -eуровень; -e — ещё сильнее за счёт времени (-9e)
-T0сжимать во все ядра
-l / -lvразмеры и степень сжатия / подробности
xzcat, xzless, xzgrep, xzdiffаналоги zcat, zless, zgrep, zdiff

С tar — опция -J: tar -cJf app.tar.xz ….

Примеры

# сжать лог; вместо access.log.1 появится access.log.1.gz
gzip /var/log/nginx/access.log.1

# сжать, оставив оригинал, и показать процент
gzip -kv dump.sql

# распаковать
gunzip dump.sql.gz

# поискать в ротированных логах, не распаковывая
zgrep -i 'error' /var/log/syslog.*.gz
zgrep -c ' 500 ' /var/log/nginx/access.log.*.gz

# склеить текущий и сжатые логи в один поток
zcat -f /var/log/nginx/access.log* | wc -l

# сжать в другой файл, исходный не трогать
gzip -c report.csv > /srv/backup/report.csv.gz

# сжатие на лету в конвейере
pg_dump app | gzip > app.sql.gz
gunzip -c app.sql.gz | head

# проверить все архивы в каталоге
for f in /srv/backup/*.gz; do gzip -t "$f" || echo "битый: $f"; done

# посмотреть степень сжатия
gzip -l dump.sql.gz

# сжать все файлы в каталоге по отдельности
gzip -r /srv/app/logs

# xz: сжать сильно, оставив оригинал, во все ядра
xz -k -T0 big.log
xzcat big.log.xz | tail

Подводные камни

  • Исходный файл исчезает. gzip файл удаляет оригинал после сжатия, gunzip — удаляет .gz. Нужен оригинал — добавь -k или используй -c с перенаправлением.
  • Каталог не сжимается: «is a directory -- ignored». gzip -r сожмёт каждый файл внутри по отдельности, а не соберёт их в один архив. Для архива нужен tar -czf.
  • Уже существующий .gz не перезаписывается: «already exists; not overwritten», код возврата 2. Добавь -f.
  • gunzip требует расширение. Файл без .gz вызовет «unknown suffix -- ignored». Читай через zcat файл или gunzip -c файл > результат.
  • Файлы с жёсткими ссылками и символические ссылки gzip без -f пропускает. С -f по символической ссылке он сожмёт содержимое цели в ссылка.gz, а саму ссылку удалит.
  • -9 не всегда заметно меньше. На многих данных разница с -6 — единицы процентов, а время растёт. Для сильного сжатия бери xz.
  • zcat на несжатом файле выдаст «not in gzip format». Если в списке смешаны .log и .log.gz, используй zcat -f.
  • Склеенные .gz работают, но -l врёт. cat a.gz b.gz > c.gz — корректный файл, zcat выдаст оба содержимых. А gzip -l покажет размер только последней части; точный размер — zcat файл | wc -c.
  • Оборванный файл. zcat выведет всё, что успел распаковать, и только потом «unexpected end of file». Проверяй код возврата или gzip -t перед использованием.

См. также

tar · logrotate · grep · rsync · checksums · pg-tools