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 | листать сжатый файл |
zgrep | grep по сжатым файлам, принимает те же опции (-i, -c, -l, -h) |
zdiff / zcmp | diff / 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перед использованием.