Документация gzip

Обзор

Gzip уменьшает размер заданных файлов, используя кодирование Лемпеля-Зива (LZ77). Там, где это возможно, каждый файл заменяется архивом с расширением .gz, при этом сохраняются владелец, режимы, доступ и времена модификации. (Расширения по умолчанию — gz для VMS, z для MSDOS, OS/2 FAT, Windows NT FAT и Atari). Если никаких файлов не указано или имя файла ‘-‘, то пакуется стандартный ввод и выдается на стандартный вывод. Gzip будет пытаться сжать только обычные файлы. в частности ‘gzip’ игнорирует символические ссылки.

Если имя сжатого файла слишком длинное для файловой системы, где он находится, gzip урезает его. Gzip пытается укоротить только те части имени файла, которые длиннее 3 символов (на части файл разбивается точкой). Если имя файла состоит только из коротких частей, укорачиваются только самые длинные части. Например, если имя файла ограничено 14-ю символами, gzip.msdos.exe сжимается в gzi.msd.exe.gz. Имена не укорачиваются на файловых системах, не имеющих ограничения по длине имени файла.

По умолчанию gzip сохраняет в сжатом файле его оригинальное имя и временную метку. Это нужно для разархивирования файла с опцией -N. Она используется, если имя сжатого файла было усечено или временная метка при перемещении файла не сохранилась.

В случае обычных файлов, по умолчанию gzip сохраняет временную метку в архивном файле. Это может быть полезно при распаковке с помощью –N, если временная метка не сохранилась при трансфере файла. Однако, из-за ограничений текущего gzip формата, показания долей секунд отбрасываются. Также временная метка должна попадать под временной отрезок между 1970-01-01 00:00:01 и 2106-02-07 06:28:15 UTC, и хост, который использует 32 битную временную отметку в будущем будет ограничен отрезком не позже 2038-01-19 03:14:07 UTC. Верхние границы предполагают типичные случаи, когда високосные секунды не принимаются во внимание.

Сжатые файлы могут быть восстановлены в первоначальное состояние командой gzip -d или gunzip или zcat. Если оригинальное имя файла, сохранённое в архиве, не допускается файловой системой, в которой он находится, то ему даётся новое имя из первоначального по правилам этой системы.

gunzip берёт список файлов из командной строки и заменяет каждый файл с расширением .gz, .z -gz, -z, or _z нераспакованный файл без оригинального расширения, который начинается с корректного магического числа. gunzip также распознаёт специальные расширения .tgz и .taz как сокращения от .tar.gz и .tar.Z соответственно. Сжимая файл, gzip по необходимости использует расширение .tgz вместо усечения имени у файла с расширением .tar.

gunzip на данный момент может распаковывать архивы, созданные gzip, zip, compress или pack. Определение формата архива автоматическое. Используя первые два формата, gunzip проверяет 32-битный CRC. Для формата pack, gunzip проверяет длину разархивированного файла. Стандартный формат compress не был рассчитан на возможность проверки целостности архива. Тем не менее, gunzip в некоторых ситуациях может распознать повреждённый .Z-файлы. Если вы получаете сообщение об ошибке в процессе распаковки .Z-файла, не думайте, что он не повреждён, если стандартный uncompress не выдает сообщений об ошибке. Это обычно происходит из-за того, что стандартный ‘uncompress’ не проверил его входной файл и, соответственно, сгенерировал неверный выходной файл. На системе SCO формат ‘compress -H’ (алгоритм lzh) не использует CRC, но также допускает некоторые проверки на целостность.

Файлы, сжатые zip, могут быть распакованы gzip, только если они содержат один файл, сжатый методом ‘deflation’. Эта функция предназначена только для облегчения перевода ‘tar.zip’ файлов в формат ‘tar.gz’. Для распаковки zip-архивов, содержащих несколько файлов, вместо gunzip используйте unzip. Чтобы извлечь zip fileс одним членом, используйте команду ‘gunzip <foo.zip’ или ‘gunzip -S .zip foo.zip’. Для извлечения файлов с несколькими членами, используйте
‘unzip’ ‘вместо ‘gunzip’.

zcat идентичен gunzip -c. Zcat распаковывает любой список файлов обозначенных в командной строке или из стандартного ввода, записывая распакованные данные в стандартный вывод. Zcat распаковывает файлы с корректным магическим числом, независимо от того имеют ли они суффикс ‘.gz’.

Gzip использует алгоритм Лемпеля-Зива, применяемый в zip и PKZIP. Получаемая величина сжатия зависит от размеров входных данных и количества повторяющихся байтовых последовательностей. Текстовые данные, такие как исходные коды или просто тексты на английском языке, в среднем сжимаются на 60-70%. Сжатие обычно получается гораздо лучше, чем при использовании алгоритма LZW (используется в compress), кодировании Хаффмана (используется в pack) или адаптивном кодировании Хаффмана (compact).

Сжатие осуществляется всегда, даже если запакованный файл получается немного больше оригинала. В наихудшем случае размер файла увеличивается на несколько байт для заголовка gzip, плюс по 5 байт на каждый блок размером 32 Кб, что составляет 0.015% на больших файлах. Обратите внимание, что фактическое число занятых файлом блоков на диске практически никогда не увеличивается. gzip при сжатии/распаковке сохраняет права доступа, владельцев и временные метки файлов.

Пример работы

Представляем несколько примеров запуска ‘gzip’. Вот что будет выведено на экран после команды ‘gzip -h’:

Использование: gzip [OPTION]… [FILE]…
Сжать или распаковать файлы (по умолчанию, сжать файлы на месте)

Обязательные аргументы длинных опций обязательны для коротких команд тоже.

-c, --stdout --to-stdout Выводить полученный архив в стандартный поток вывода, оставляя оригинальные файлы нетронутыми. Если входных файлов несколько, то вывод состоит из последовательности независимо сжатых файлов. Для получения большего сжатия, объедините вместе все входные файлы перед архивированием.
-d, --decompress Распаковка.
-f, --force Проводить сжатие или распаковку, даже если на файл есть ссылки, такой архив уже существует или сжатые данные читаются или пишутся на терминал. Если входные данные не в формате, поддерживаемом gzip и задан ключ —stdout, то они без изменения копируются в стандартный поток вывода: позвольте zcat действовать как cat. Если не указан ключ -f и работа не ведётся в фоновом режиме, то gzip просит подтвердить, нужно ли переписывать уже существующий файл.
-h, --help Вывод на экран справки и выход.
-l, --list Отобразить список содержимого для упакованного файла
-L, --license Показать лицензию gzip и выйти.
-n, --no-name При сжатии не сохранять по умолчанию имя исходного файла и временные метки (оригинальное имя всегда сохраняется, если имя архива придётся усечь). При распаковке не восстанавливать имя исходного файла, даже если оно сохранено (только убрать суффикс gzip из имени архива), и не восстанавливать оригинальные временные метки (взять их со сжатого файла). Эта опция при распаковке применяется по умолчанию.
-N, --name При сжатии всегда сохранять имя и временные метки исходного файла (используется по умолчанию). При распаковке восстанавливать имя и временные метки исходного файла, если они присутствуют. Эта опция полезна в системах, имеющих ограничение на длину имени файла, или при потере временных меток файла в процессе его перемещения.
-q, --quiet Не выводить предупреждения.
-r, --recursive Рекурсивно разбирать дерево каталогов. Если в списке из командой строки указан какой-нибудь каталог, gzip зайдёт в него и сожмёт все файлы, в нём находящиеся (или распакует их в случае с gunzip).
-S, --suffix=SUF Использовать суффикс SUF вместо .gz. Может быть задано любое окончание, но суффиксов, отличных от .z и .gz лучше избегать, чтобы не спутать их с другими при переносе файлов на другие системы. Отсутствие суффикса заставляет gunzip пытаться распаковать все указанные файлы вне зависимости от их окончаний.
-t, --test Тест, проверка целостности сжатого файла.
-v, --verbose Подробно. Показывать имя и уменьшения размера в процентах для каждого файла при сжатии или распаковке.
-V, --version Версия. Показать номер версии и параметры сборки, затем выйти.
-1, --fast сжимать быстрее
-9, --best сжимать лучше
Управление скоростью сжатия посредством цифры, где -1 или —fast обозначает самый быстрый метод сжатия (хуже сжимается), и -9 или —best обозначает самый медленный (лучшая степень сжатия). Уровень сжатия по умолчанию равен -6 (хорошее сжатие при средней скорости).

После исполнения команды 'gzip -v texinfo.tex':

texinfo.tex: 71.6% -- replaced with texinfo.tex.gz

Следующая команда найдет все .gz файлы в текущей директории и поддиректориях, и распакует их на месте без удаления оригинала, остановившись на первом сбое:

find . -name '*
*' -prune -o -name '*.gz' -type f -print |
sed "
s/'/'\\\\''/g
s/^\\(.*\\)\\.gz$/gunzip <'\\1.gz' >'\\1'/
" |
sh -e

Вызов gzip

Формат командной строки для запуска программы ‘gzip’ следующий:

gzip OPTION ...

gzip поддерживает следующие опции:

--stdout'
--to-stdout'
-c'

Произвести вывод на стандартный вывод; оригиналы файлов остаются без изменений. Если указано несколько входных файлов, то вывод состоит из последовательности независимо пакуемых членов. Чтобы получить лучшее сжатие соедините все входные файлы перед их упаковкой.

--decompress
--uncompress
-d
Распаковка.

--force
-f

Заставляет производить упаковку и распаковку, даже если файл имеет множество ссылок, соответствующий файл уже существует, или запакованные данные прочитаны с терминала или записаны на терминал. Если входные данные записаны в формате, нераспознаваемом ‘gzip’, и если также была задана опция ‘—stdout’, то ‘gzip’ копирует входные данные в стандартный вывод без изменений: ‘zcat’ ведет себя как ‘cat’. Если ‘-f’ не задано и запуск произведен не в фоновом режиме, то ‘gzip’ выводит сообщение для того, чтобы проверить был ли переписан существующий файл.

--help
-h

Печатает сообщение содержащие вспомогательную информацию после чего прекращает работу.

--list
-l

Для каждого запакованного файла выводит список состоящий из следующих полей:

comressed size: размер запакованного файла
uncompressed size: размер распакованного файла
ratio: отношение паковки (0.0% если не известно)
uncompressed_name: имя не распакованного файла

Размер распакованного файла, данный при использовани ‘-l’ введен для файлов в не ‘gzip’-формате, например таких как запакованные ‘.Z’ файлы. Чтобы получить размер такого распакованного файла, вы можете использоовать:

zcat file.Z | wc -c

В сочетании с опцией —verbose следующие поля будут также отображены:

method: метод паковки (deflate,compress,lzh,pack)
crc: 32 битная CRC у распакованных данных
date&time: дата и время модификации распакованного файла

CRC вида ffffffff выдается для файлов не gzip формата.
С опцией --verbose общий размер и отношение паковки показываются также для всех
файлов, даже если некоторые размеры неизвестны. С опцией --quiet заголовок и итоговые строки не отображаются.
gzip формат имеет размерный модуль 2^32, так что соотношение размера несжатых и сжатых файлов отображается неверно для несжатых файлов размером больше 4 GB. Чтобы обойти эту проблему, вы можете использовать следующую команду, чтобы отыскать размер большого несжатого файла:
zcat file.gz | wc -c

--license
-L

Отображает лицензию ‘gzip’ после чего заканчивает работу

--no-name
-n

В процессе паковки не сохраняет оригинальное имя файла и время создания (Оригинальное имя файла всегда сохраняется, если только имя не было укорочено). В процессе распаковки файла, запакованного с данной опцией, не восстанавливаются оригинальное имя файла (убирается только ‘gzip’ суффикс у имени запакованного файла) и время создания (копирует время создания файла-архива). В процессе распаковки эта опция отсутствует.

--name
-N

В процессе паковки всегда сохраняет оригинальное имя файла и время создания, работает по умолчанию. Во время распаковки восстанавливает оригинальное имя файла и время создания. Эта опция удобна для тех систем, в которых существует ограничение на длину имени файла или когда время создания файла было потеряно после переноса файла.

--quiet
-q

Запрещает все предупреждающие сообщения.

--recursive
-r

Рекурсивно обходит структуру каталогов. Если имя какого-нибудь файла, указанного в командной, строке представляет собой каталог, то ‘gzip’ спустится в этот директорий и запакует все файлы, которые там найдет (или распакует в случае ‘gunzip’).
--rsyncable
Для лучшего обслуживания rsync программы периодически сбрасывайте внутреннюю структуру сжатия потока данных. Это даст rsync программе преимущество схожести при синхронизации двух файлов сжатых с этим значением. Цена этому – сжатый файл обычно на 1 процент больше исходного.

--suffix suf
-S suf

Использует суффикс ‘SUF’ вместо ‘.gz’. Может быть задан любой суффикс, но суффиксов отличных от ‘.z’ или ‘.gz’ следует избегать, чтобы не возникало путаницы при переносе файлов в другую систему. Пустой суффикс заставляет ‘gunzip’ попробовать распаковать все
заданные файлы независимо от суффиксов, например:

gunzip -S "" * (*.* for MSDOS)

Предыдущие версии gzip использовали суффикс ‘.z’ ,но потом это было изменено, чтобы избежать путаницы с ‘pack’.
—synchronous
Используйте synchronous вывод передавая выходные данные на место хранения файла, если система поддерживает данную функцию. Поскольку данные файловой системы можно кэшировать, без этой опции, если система выйдет из строя например во время выполнения команды типа «gzip FOO», пользователь может потерять как FOO, так и FOO.gz; это значение по умолчанию для gzip, как и для большинства приложений, перемещающих данные. Когда используется этот параметр, gzip безопаснее, но может быть значительно медленнее.
--test
-t

Проверка.Проверяет целостность архивного файла.

--verbose
-v

Отображает имя и процентное отношение паковки для каждого файла.

--version
-V

Версия. Отображает номер версии и опции компиляции после чего завершает работу.

--fast
--best
-N

Регулируют скорость паковки, используя указанное число N, где ‘-1’ или ‘—fast’ отображают самый быстрый метод паковки (менее сжимающий), и ‘—best’ или ‘-9’, отображают наиболее медленный метод (оптимальное сжатие). По умолчанию уровень сжатия ‘-6’ (направлен на
высокое сжатие при издержках в скорости).

Использование для продвинутых

Несколько сжатых файлов можно объединить в один. В этом случае gunzip распакует все файлы одновременно. Если один из файлов окажется поврежденным, то другие файлы могут быть восстановлены после удаления поврежденного. Лучшее сжатие может быть также достигнуто, если все файлы будут распакованы и затем перепакованы все вместе одновременно.

Пример соединения ‘gzip’ файлов:
gzip -c file1 >foo.gz
gzip -c file2 >>foo.gz
Если затем выдать команду
gunzip -c foo
это эвивалент
cat file1 file2

В случае повреждения одного элемента файла «.gz», другие элементы все еще могут быть восстановлены (если поврежденный элемент удален). Однако вы можете улучшить сжатие, сжав сразу все элементы:
cat file1 file2 | gzip > foo.gz

Коэффициент сжатия в этом случае будет лучше, чем при использовании команды:
gzip -c file1 file2>foo.gz

Если вы хотите перепаковать объединённые файлы для достижения большего сжатия, выполните:
zcat old.gz | gzip > new.gz

Если в архиве несколько файлов, то размер несжатых данных и CRC, показываемые по опции -list, относятся только к последнему файлу. Если вам нужен несжатый размер всех файлов, можно использовать:
zcat file.gz | wc –c

Если вы хотите создать единый архив с множеством файлов так, чтобы их потом можно было извлечь независимо друг от друга, используйте другие архиваторы, такие как tar или zip. GNU tar поддерживает опцию -z, по которой вызывается непосредственно gzip. gzip создан как дополнение к tar-у, а не как замена.

Окружение

Переменная окружения GZIP может содержать набор опций по умолчанию для gzip. Эти опции обрабатываются первыми и могут быть переопределены явным их указанием в командной строке. Так как это может вызвать проблемы при использовании скриптов, эта функция может быть использована, где не вызовет большого вреда и gzip предупредит в этом случае. Эта функция будет удалена в последующих релизах gzip.

Вы можете использовать псевдонимы идентификаторов и скрипт вместо нее. Например, если gzip находится в директории ‘/usr/bin’ вы можете добавить $HOME/bin в ваш путь и создать извлекаемый скрипт $HOME/bin/gzip, содержащий следующее:
#! /bin/sh
export PATH=/usr/bin
exec gzip -9 "[email protected]"

Использование 'gzip' с ленточными накопителями.

При упаковке данных на магнитную ленту необходимо дополнять вывод нулями для границы блока. Когда данные читаются, и блок для распаковки целиком передан, ‘gunzip’ определяет, не был ли прочитан лишний мусор после архивных данных, и выдает предупрежение при его наличии. Вы можете использовать ‘—quiet’ для отключения предупреждений.

Диагностика

Код возврата в нормальной ситуации равен 0. Если возникла ошибка, код возврата 1. Если вышло предупреждение, код возврата 2.

Использование: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
Invalid options were specified on the command line. В командной строке были указаны неправильные ключи.
file: not in gzip format Файл, указанный gunzip, не сжат.
file: Corrupt input. Use zcat to recover some data. Сжатый файл повреждён. Воспользуйтесь zcat для восстановления части данных. Данные до точки повреждения могут быть восстановлены командой
zcat файл > recover
file:compressed with xx bits, can only handle yy bits Файл был сжат (используя LZW) программой, которая может использовать больше бит, чем программа распаковки на этом компьютере. Перепакуйте файл gzip, который лучше сжимает и использует меньше памяти.
file:already has .gz suffix -- no change Файл считается уже сжатым. Переименуйте его и попробуйте снова.
file already exists; do you wish to overwrite (y or n)? Ответьте «y», если хотите переписать уже существующий архив, в противном случае «n».
gunzip: corrupt input Было зафиксировано нарушение SIGSEGV, что обычно означает, что входной файл повреждён.
xx.x% Сжатием достигнуто уменьшение размера на данную величину. (Относится к ключам -v и -l.)
-- not a regular file or directory: ignored Если указанный файл не является обычным файлом или каталогом (например символическая ссылка, сокет, очередь, файл устройства и т.д.), он не обрабатывается.
-- has xx other links: unchanged На указанный файл есть ссылки — он пропускается. Читайте ln(1) для получения дополнительной информации. Для принудительного сжатия таких файлов используйте ключ -f.

Предостережения

При записи сжатых данных на ленту обычно нужно дополнять архив нулями до конца блока. Когда архив считан с ленты и передан gunzip на распаковку, gunzip обнаруживает, что после сжатых данных идёт мусор, и по умолчанию выдаёт предупреждение. Для отключения предупреждений используйте ключ —quiet. Этот ключ может быть задан в переменной окружения GZIP, например:

для sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
для csh: (setenv GZIP -q; tar -xfz --block-compr /dev/rst0
В приведённом примере gzip неявно вызывается ключом -z в GNU tar. Имейте в виду, что для записи и чтения архива с ленты необходимо использовать один и тот же размер блока (опция -b в tar). (Этот пример подразумевает, что вы используете версию tar от GNU.)

Ошибки

Формат gzip представляет входной размер модуля 2^32, таким образом опция —list сообщает неправильные размеры не сжатых файлов и коэффициенты сжатия для не архивированных файлов размером 4 и более гигабайт. Чтобы обойти эту проблему, вы можете воспользоваться следующей командой, чтобы определить истинный размер большого распаковываемого файла:

zcat file.gz | wc -c
Ключ —list выдаёт размер как -1 и CRC как ffffffff, если архив находится на устройстве с последовательным доступом.

В некоторых редких случаях ключ —best даёт худшее сжатие, чем метод по умолчанию (-6). Некоторые файлы, содержащие чрезвычайно избыточную информацию, compress сжимает лучше, чем gzip.

Copyright © 1998-1999, 2001-2002, 2006-2007, 2009-2018 Free Software Foundation, Inc.

Copyright © 1992, 1993 Jean-loup Gailly

Источник: https://www.gnu.org/software/gzip/manual/gzip.html

Оцените статью
GZIP - утилита сжатия и восстановления файлов