Библиотека сайта rus-linux.net
Программа сжатия файлов gzip
Жан-Лу Гайи (Jean-loup Gailly)1. Обзор 'gzip' сокращает размер заданных файлов используя кодирование Зива -Лемеля (LZ77). Когда возможно, каждый файл замещается файлом с расширением '.gz', при этом сохраняются владелец, режимы, доступ и времена модификации (Другие расширения '-gz' для VMS, 'z' для MSDOS, OS/2, FAT и Atari). Если никаких файлов не указано или имя файла '-', то пакуется стандартный ввод и выдается на стандартный вывод. 'gzip' пытается паковать только обычные файлы, в частности 'gzip' игнорирует символические ссылки. Если новое имя файла слишком длинно для данной системы, 'gzip' укорачивает его. 'gzip' пытается укоротить только те части имени файла, которые длиннее, чем 3 символа (Часть ограниченная точками). Если имя состоит только из маленьких частей, то будут укорочены самые длинные части. Например, если имя файла ограничено 14 символами, то gzip.msdos.exe будет после сжатия иметь имя gzi.msd.exe.gz. Имена не укорачиваются в системах, у которых нет ограничения на длину имени. По умолчанию 'gzip' сохраняет оригинальное имя файла и время создания в запакованном файле. Они используются, когда файл распаковывается с опцией '-N'. Это удобно, когда имя пакуемого файла было укорочено, и когда время создания не было сохранено после пересылки файла. Запакованный файл, может быть приведен к исходному виду используя 'gzip -d' или 'gunzip' или 'zcat'. Если оригинальное имя файла, сохраненное в запакованном файле, не переносимо в данную файловою систему, то новое имя будет сконструировано из оригинального, так чтобы сделать его приемлемым. 'gunzip' берет список файлов из командной строки и замещает каждый файл, чье имя оканчивается на '.gz', '.z', '.Z', '-gz', '-z', '_Z' и который начинается с корректного магического числа, на распакованный файл без оригинального расширения. 'gunzip' также распознает специальные расширения '.tgz', '.taz', как сокращения от '.tar.gz', '.tar.Z' соответственно. Во время паковки 'gzip' использует расширение '.tgz', если необходимо, вместо укорачивания файла с расширением '.tar'. 'gunzip' распаковывает файлы созданные 'gzip', 'zip', 'compress', 'pack'. Определение формата ввода производится автоматически. Когда используются первые 2 формата, 'gunzip' проверяет 32 битные значения CRC (циклический избыточный контроль) Для 'pack', 'gunzip' проверяет длины распакованных файлов. Формат 'compress' не предназначен для проверки целостности. Однако, 'gunzip' иногда способен проверить и плохие '.Z' файлы. Если вы получили ошибку во время распаковки '.Z' файла , не предполагайте что этот файл корректен, только потому что стандартный 'uncompress' не выдает сообщений об ошибке. Как правило это означает, что стандартный 'uncompress' не проверил его входной файл и, соответственно, сгенерировал неверный выходной файл. SCO 'compress -H' формат (lzh метод паковки) не включает CRC, но также поддерживает некоторую проверку целостности. Файлы созданные 'zip' могут быть распакованы 'gzip', только если они имеют одного члена сжатого методом 'deflation'. Эта особенность встроена только для облегчения перевода 'tar.zip' файлов в формат 'tar.gz'. Для извлечения файлов с несколькими членами, используйте 'unzip' 'вместо 'gunzip'. 'zcat' идентичен 'gunzip -c'. 'zcat' распаковывает любой список файлов обозначенных в командной строке или из стандартного ввода, при этом, записывая распакованные данные в стандартный вывод. 'zcat' распаковывает файлы с корректным магическим числом, независимо от того имеют ли они суффикс '.gz'. 'gzip' использует алгоритм Зива-Лемеля также как 'zip', 'PKZIP'. Итоговый размер, полученного файла после сжатия, зависит от размера исходного файла и наличия в нем общих подстрок. Обычно, такой текст, как исходный код или английский текст сокращается на 60-70%. Паковка с использованием этого алгоритма обычно лучше, чем при использовании LZW (его использует 'compress'), кодирование Хаффмана (его использует 'pack') или адаптированное кодирование Хаффмана ('compact'). Упаковка происходит независимо от того увеличился ли размер упакованного файл в сравнении с оригиналом или нет. Причина расширения - несколько байтов для заголовка 'gzip' файла, плюс 5 байтов для каждого 32К блока, или отношение расширения 0.015% от длины файла. Заметим, что фактическое число занятых на диске блоков уже никогда не возрастает. 'gzip' сохраняет режимы доступа, владельцев и время модификации файлов при упаковке и распаковке. 2. Пример работы Представляем несколько примеров запуска 'gzip'. Вот что будет выведено на экран после команды 'gzip -h': gzip 1.2.4 (18 Aug 93) usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...] -c --stdout write on standard output, keep original files unchanged -d --decompress decompress -f --force force overwrite of output file and compress links -h --help give this help -l --list list compressed file contents -L --license display software license -n --no-name do not save or restore the original name and time stamp -N --name save or restore the original name and time stamp -q --quiet suppress all warnings -r --recursive operate recursively on directories -S .suf --suffix .suf use suffix .suf on compressed files -t --test test compressed file integrity -v --verbose verbose mode -V --version display version number -1 --fast compress faster -9 --best compress better file... files to (de)compress. If none given, use standard input. После исполнения команды 'gzip -v texinfo.tex': texinfo.tex: 71.6% -- replaced with texinfo.tex.gz Следующая команда найдет все 'gzip' файлы в текущем директории и поддиректориях, и распакует их без разрушения оригинала: find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip < "&" > "\1"/' | sh 3. Запуск '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 заголовок и итоговые строки не отображаются ( totals lines). '--license' '-L' Отображает лицензию 'gzip' после чего заканчивает работу '--no-name' '-n' В процессе паковки не сохраняет оригинальное имя файла и время создания (Оригинальное имя файла всегда сохраняется, если только имя не было укорочено). В процессе распаковки файла, запакованного с данной опцией, не восстанавливаются оригинальное имя файла (убирается только 'gzip' суффикс у имени запакованного файла) и время создания (копирует время создания файла-архива). В процессе распаковки эта опция отсутствует. '--name' '-N' В процессе паковки всегда сохраняет оригинальное имя файла и время создания, работает по умолчанию. Во время распаковки восстанавливает оригинальное имя файла и время создания. Эта опция удобна для тех систем, в которых существует ограничение на длину имени файла или когда время создания файла было потеряно после переноса файла. '--quiet' '-q' Запрещает все предупреждающие сообщения. '--recursive' '-r' Рекурсивно обходит структуру каталогов. Если имя какого-нибудь файла, указанного в командной, строке представляет собой каталог, то 'gzip' спустится в этот директорий и запакует все файлы, которые там найдет (или распакует в случае 'gunzip'). '--suffix SUF' '-S SUF' Использует суффикс 'SUF' вместо '.gz'. Может быть задан любой суффикс, но суффиксов отличных от '.z' или '.gz' следует избегать, чтобы не возникало путаницы при переносе файлов в другую систему. Пустой суффикс заставляет 'gunzip' попробовать распаковать все заданные файлы независимо от суффиксов, например: gunzip -S""* (*.* для MSDOS) Предыдущие версии 'gunzip' использовали суффикс '.z' ,но потом это было изменено, чтобы избежать путаницы с 'pack'. '--test' '-t' Проверка.Проверяет целостность архивного файла. '--verbose' '-v' Отображает имя и процентное отношение паковки для каждого файла. '--version' '-V' Версия. Отображает номер версии и опции компиляции после чего завершает работу. '--fast' '--best' '-N' Регулируют скорость паковки, используя указанное число N, где '-l' или '--fast' отображают самый быстрый метод паковки (менее сжимающий), и '--best' или '-9', отображают наиболее медленный метод (оптимальное сжатие). По умолчанию уровень сжатия '-6' (направлен на высокое сжатие при издержках в скорости). 4. Рекомендации по использованию. Несколько пакуемых файлов могут быть соединены. В этом случае, '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' относятся (applies) только к последнему члену. При необходимости просмотра размеров всех распакованных членов, использутся команда: zcat file.gz | wc -c В случае необходимости создания архива с несколькими членами и возможностью извлечения их из архива независимо, рекомендуется использовать такие архиваторы как 'tar', 'zip'. GNU 'tar' поддерживает опцию '-z' для прозрачного запуска'gzip'. 'gzip' был написан, как дополнение к 'tar', а не как его замена. 5. Окружение. Переменная окружения 'GZIP' может содержать в себе различные опции 'gzip', которые будут использоваться как умолчательные. Эти опции интепретируются первыми и могут быть полностью перекрыты параметрами командной строки. Например: for sh: GZIP="-8v--name";export GZIP for csh: setenv GZIP "-8v--name" for MSDOS: set GZIP=-8v--name Для избежания конфликта с множеством символов для запуска программ на VAX/VMS эта переменная окружения называется GZIP_OPT. 6. Использование 'gzip' с ленточными накопителями. При упаковке данных на магнитную ленту необходимо дополнять вывод нулями для границы блока. Когда данные читаются, и блок для распаковки целиком передан, 'gunzip' определяет, не был ли прочитан лишний мусор после архивных данных, и выдает предупрежение при его наличии. Вы можете использовать '--quiet' для подавления предупреждений. Эта опция может быть установлена в переменной окружения: for sh: GZIP="-q" tar -xzf--blocks-compress/dev/rst0 for csh: (setenv GZIP "-q";tar -xzf--blocks-compress/dev/rst0 В этом примере 'gzip' запускается неявно из программы 'tar', которой была передана соответствующая опцией '-z'. Следует убедиться, что одинаковый размер блока используется как при записи, так и при чтении сжатых данных на ленту (ключ -b). (Мы подразумеваем, что Вы пользуетесь GNU-версией программы tar.