bzip2(1) General Commands Manual bzip2(1)

ИМЯ

bzip2, bunzip2 — программа для блочно-сортирующего сжатия файлов, версия 1.0.8
bzcat — восстановить файлы и записать результат в стандартный поток вывода
bzip2recover — восстановить данные из повреждённых файлов bzip2

СИНТАКСИС

bzip2 [ -cdfkqstvzVL123456789 ] [ имена_файлов ... ]
bunzip2 [ -fkvsVL ] [ имена_файлов ... ]
bzcat [ -s ] [ имена_файлов ... ]
bzip2recover имя_файла

ОПИСАНИЕ

bzip2 сжимает файлы, используя алгоритм блочно-сортирующего сжатия текста Барроуза — Уилера и кодирование Хаффмана. Степень сжатия, как правило, значительно превышает таковую при использовании более распространённых программ, основанных на LZ77/LZ78, в то время как скорость приближается к статистическим алгоритмам сжатия семейства PPM.

Параметры командной строки были намеренно сделаны похожими на параметры GNU gzip, но они не идентичны.

bzip2 ожидает, что флаги командной строки сопровождаются списком имён файлов. Каждый файл заменяется его сжатой версией с именем «исходное_имя.bz2». Каждый сжатый файл имеет ту же дату изменения, права доступа и, по возможности, тех же владельцев, что и исходный файл, благодаря чему эти атрибуты могут быть корректно восстановлены. Обработка имён файлов примитивна в том смысле, что не существует механизма сохранения исходных имён файлов, прав доступа, владельцев или дат в файловых системах, в которых отсутствуют эти понятия или существуют серьёзные ограничения на длину имени файла, таких как MS-DOS.

По умолчанию bzip2 и bunzip2 не будут перезаписывать существующие файлы. Если вы хотите, чтобы перезапись осуществлялась, укажите флаг -f.

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

bunzip2 (или bzip2 -d) восстанавливает все указанные файлы. При обнаружении файла, который не был создан программой bzip2, будет выведено предупреждение и такой файл будет проигнорирован. bzip2 пытается определить имя восстановленного файла, основываясь на имени сжатого файла, следующим образом:


имя_файла.bz2 преобразуется в имя_файла
имя_файла.bz преобразуется в имя_файла
имя_файла.tbz2 преобразуется в имя_файла.tar
имя_файла.tbz преобразуется в имя_файла.tar
любое_другое_имя преобразуется в любое_другое_имя.out

Если имя файла не заканчивается на одно из распознаваемых окончаний (.bz2, .bz, .tbz2 или .tbz), bzip2 сообщит о том, что определить имя исходного файла не удалось, и воспользуется первоначальным именем с добавлением окончания .out.

Как и в случае с операцией сжатия, если имена файлов не были указаны, данные из стандартного потока ввода будут восстановлены и отправлены в стандартный поток вывода.

bunzip2 корректно восстановит файл, который представляет собой объединение двух или более сжатых файлов. Результатом будет являться объединение соответствующих несжатых файлов. Проверка целостности (-t) объединённых сжатых файлов также поддерживается.

Вы также можете сжимать или восстанавливать файлы в стандартный поток вывода, указав флаг -c. Несколько файлов могут быть сжаты или восстановлены таким образом. Результат операции передаётся последовательно в стандартный поток вывода. При сжатии подобным образом нескольких файлов формируется поток, содержащий сжатые представления нескольких файлов. Такой поток может быть корректно восстановлен только посредством bzip2 версии 0.9.0 или более поздней. Ранние версии bzip2 прекратят работу после восстановления первого файла в потоке.

bzcat (или bzip2 -dc) восстанавливает все указанные файлы и записывает результат в стандартный поток вывода.

bzip2 считывает аргументы из переменных среды BZIP2 и BZIP (в указанном порядке) и обрабатывает их перед обработкой любых аргументов, считанных из командной строки. Данная возможность предоставляет удобный способ передачи аргументов по умолчанию.

Сжатие выполняется всегда, даже если размер полученного в результате сжатия файла немного превышает размер оригинального. Файлы размером менее ста байт, как правило, становятся больше, так как механизм сжатия всегда подразумевает дополнительные затраты в размере около 50 байт. Случайные данные (в том числе выходные данные большинства программ для сжатия файлов) кодируются из расчёта около 8,05 бита на один байт, что приводит к увеличению размера примерно на 0,5%.

В качестве самопроверки с целью защиты ваших данных bzip2 использует 32-разрядные суммы CRC, чтобы убедиться, что восстановленная версия файла идентична исходной. Это защищает от повреждения сжатых данных и от невыявленных ошибок в программе bzip2 (надеемся, весьма маловероятных). Вероятность того, что повреждение данных останется незамеченным, ничтожно мала и составляет примерно один к четырём миллиардам для каждого обрабатываемого файла. Однако следует иметь в виду, что программа выполняет проверку при восстановлении и сможет лишь сообщить вам о возникновении проблемы, но не сможет помочь восстановить исходные несжатые данные. Вы можете воспользоваться bzip2recover, чтобы попытаться восстановить данные из повреждённых файлов.

Возвращаемые значения: 0 при нормальном завершении, 1 в случае проблем с окружением (не найден файл, неверные флаги, ошибки ввода-вывода и т.п.), 2 в случае повреждений в сжатом файле, 3 в случае ошибок внутренней целостности (например, дефектов в программе), которые привели к неработоспособности bzip2.

ПАРАМЕТРЫ

Выполнить сжатие или восстановление и записать результат в стандартный поток вывода.
Выполнить восстановление принудительно. bzip2, bunzip2 и bzcat в действительности являются одной и той же программой, а решение о том, какую операцию выполнить, принимается на основе используемого имени. Данный флаг переопределяет этот алгоритм и заставляет bzip2 выполнить восстановление.
Дополнение к параметру -d: выполнить сжатие независимо от имени, под которым была вызвана программа.
Проверить целостность указанных файлов, но не восстанавливать их. В действительности выполняется пробное восстановление с отбрасыванием результатов.
Выполнять перезапись выходных файлов принудительно. В обычном режиме bzip2 не перезаписывает существующие выходные файлы. Данный параметр также позволяет bzip2 нарушать жёсткие ссылки на файлы, чего не может произойти при его отсутствии.

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

Оставлять (не удалять) входные файлы в ходе сжатия или восстановления.
Уменьшить объём потребляемой памяти при сжатии, восстановлении и проверке. Файлы будут восстановлены или проверены с использованием модифицированного алгоритма, которые требует лишь 2,5 байта на 1 байт блока. Это означает, что любой файл может быть восстановлен с использованием 2300К памяти, хотя и с вдвое меньшей скоростью, чем обычно.

При сжатии параметр -s задаёт размер блока равным 200К, что ограничивает потребление памяти в пределах примерно той же величины за счёт степени сжатия. Вкратце, если на вашей машине доступно мало памяти (8 мегабайт и менее), используйте параметр -s для любых операций. См. УПРАВЛЕНИЕ ПАМЯТЬЮ ниже.

Не выводить несущественные предупреждающие сообщения. Сообщения, относящиеся к ошибкам ввода-вывода и другим критическим событиям, подавляться не будут.
Режим подробного вывода — отображать степень сжатия для каждого обработанного файла. Указание дополнительных параметров -v увеличивают уровень детализации, приводя к выводу больших объёмов информации, которая в первую очередь представляет интерес в целях диагностики.
Отобразить версию программного обеспечения и условия лицензирования.
от -1 (или --fast) до -9 (или --best)
Задать размер блока при сжатии равным 100 К, 200 К .. 900 К. Не оказывает влияния на операцию восстановления. См. УПРАВЛЕНИЕ ПАМЯТЬЮ ниже. Псевдонимы --fast и --best предназначены в первую очередь для совместимости с GNU gzip. В частности, --fast не приводит к значительному увеличению скорости, а --best всего лишь выбирает поведение по умолчанию.
--
Воспринимать все последующие аргументы в качестве имён файлов, даже если они начинаются с дефиса. Данный параметр предназначен для работы с файлами, имена которых начинаются на дефис, например: bzip2 -- -имямоегофайла.
Данные флаги избыточны для версии 0.9.5 и выше. В более ранних версиях они обеспечивали возможность грубой регулировки поведения алгоритма сортировки, что иногда могло быть полезным. Версии 0.9.5 и выше содержат улучшенный алгоритм, что сделало данные флаги неактуальными.

УПРАВЛЕНИЕ ПАМЯТЬЮ

bzip2 сжимает большие файлы блоками. Размер блока влияет на достигаемую степень сжатия, а также на объём памяти, необходимой для сжатия и восстановления. Флаги от -1 до -9 задают размер блока от 100 000 байт до 900 000 байт (по умолчанию) соответственно. При восстановлении размер блока, использовавшийся для сжатия, считывается из заголовка сжатого файла, и bunzip2 выделяет себе ровно столько памяти, сколько необходимо для восстановления файла. Поскольку размеры блоков хранятся в сжатых файлах, в ходе восстановления флаги от -1 до -9 не имеют смысла и, как следствие, игнорируются.

Оценка в байтах памяти, требуемой для сжатия и восстановления, может быть выполнена следующим образом:


Сжатие: 400К + ( 8 x размер блока )


Восстановление: 100К + ( 4 x размер блока ), или
100К + ( 2,5 x размер блока )

Увеличение размера блоков приводит к быстрому убыванию предельной отдачи. Эффект от сжатия в основном приходится на первые двести или триста килобайт размера блока — факт, который следует иметь в виду при использовании bzip2 на небольших машинах. Также важно учитывать, что требования к памяти при восстановлении задаются во время сжатия путём выбора размера блока.

Для восстановления файлов, сжатых с размером блока по умолчанию, равным 900К, bunzip2 потребует около 3700 Кбайт памяти. Чтобы обеспечить возможность восстановления любого файла на машинах с 4 мегабайтами памяти, bunzip2 позволяет выполнять восстановление с использованием половины указанного выше объёма, около 2300 Кбайт. Скорость восстановления также уменьшается вдвое, поэтому данную возможность следует использовать только при необходимости. Флаг, соответствующий такому режиму восстановления: -s.

В целом, старайтесь использовать наибольший размер блока, который позволяет доступная память, чтобы добиться максимальной степени сжатия. Размер блока практически не влияет на скорость сжатия и восстановления.

Ещё один важный момент касается файлов, которые помещаются в один блок, то есть большинства файлов, с которыми вы столкнётесь, если используется большой размер блока. Объём памяти, которая в действительности будет использована, пропорционален размеру файла, поскольку файл меньше блока. Например, сжатие файла размером 20 000 байт с использованием флага -9 приведёт к тому, что программа выделит около 7600К памяти, но будет использовать лишь 400К + 20000 * 8 = 560 Кбайт. Аналогичным образом, при восстановлении программа выделит 3700К, но будет использовать лишь 100К + 20000 * 4 = 180 Кбайт.

Ниже приведена таблица со сводной информацией о максимальных объёмах используемой памяти для блоков разных размеров. Также приведён итоговый размер в результате сжатия 14 файлов Корпуса Calgary Text Compression общим размером 3 141 622 байта. Этот столбец даёт некоторое представление о том, как меняется степень сжатия в зависимости от размера блока. Приведённые цифры могут преуменьшать преимущества блоков большего размера при сжатии больших файлов, поскольку в Корпусе преобладают файлы меньшего размера.


Расходы Расходы Расходы при Размер
Флаг при сжатии при восст. восст. (-s) Корпуса


-1 1200К 500К 350К 914704
-2 2000К 900К 600К 877703
-3 2800К 1300К 850К 860338
-4 3600К 1700К 1100К 846899
-5 4400К 2100К 1350К 845160
-6 5200К 2500К 1600К 838626
-7 6100К 2900К 1850К 834096
-8 6800К 3300К 2100К 828642
-9 7600К 3700К 2350К 828642

ВОССТАНОВЛЕНИЕ ДАННЫХ ИЗ ПОВРЕЖДЁННЫХ ФАЙЛОВ

bzip2 сжимает файлы блоками, обычно размером 900 Кбайт. Каждый блок обрабатывается независимо от других. Если ошибка носителя или передачи данных приводит к повреждениям в многоблочном файле .bz2, существует возможность восстановления данных из неповреждённых блоков файла.

Сжатое представление каждого блока отделяется 48-битной последовательностью, которая позволяет с достаточной уверенностью определить границы блока. Каждый блок также содержит 32-разрядную контрольную сумму CRC своего содержимого, что позволяет различать повреждённые и неповреждённые блоки.

bzip2recover представляет собой простую программу, предназначенную для поиска блоков в файлах .bz2 и записи каждого блока в отдельный файл .bz2. Затем вы можете воспользоваться bzip2 -t для проверки целостности полученных файлов и восстановить те из них, что не были повреждены.

bzip2recover принимает единственный аргумент — имя повреждённого файла — и записывает некоторое число файлов "rec00001file.bz2", "rec00002file.bz2" и т.д., содержащих извлечённые блоки. Имена выходных файлов составлены таким образом, чтобы при использовании шаблонов имён файлов (wildcards, например, «bzip2 -dc rec*file.bz2 > восстановленные_данные») обработка файлов происходила в правильном порядке.

bzip2recover наиболее полезен при работе с большими файлами .bz2, так как они состоят из большого числа блоков. Очевидно, что использование данной программы в случае повреждения одноблочных файлов бессмысленно, так как повреждённый блок не может быть восстановлен. Если вы хотите минимизировать риск потери данных из-за ошибок носителя или передачи, вы можете рассмотреть возможность сжатия с меньшим размером блока.

ПРИМЕЧАНИЯ О ПРОИЗВОДИТЕЛЬНОСТИ

На этапе сортировки при сжатии выполняется сбор похожих строк в файле. В связи с этим сжатие файлов, содержащих очень длинные последовательности повторяющихся символов, такие как «aabaabaabaab ...» (повторяется несколько сотен раз), может выполняться медленнее, чем обычно. Версии 0.9.5 и выше с этой точки зрения намного лучше предыдущих версий: соотношение между временами сжатия в худшем и общем случаях составляет около 10:1. Для предыдущих версий этот показатель составлял порядка 100:1. При желании вы можете использовать параметр -vvvv, чтобы отслеживать ход выполнения во всех подробностях.

Данное явление не влияет на скорость восстановления.

bzip2, как правило, выделяет для своей работы несколько мегабайт памяти, после чего использует всё выделенное пространство в относительно произвольном порядке. Это означает, что производительность как сжатия, так и восстановления, в значительной мере определяется скоростью, с которой ваша машина способна обрабатывать промахи кэша. В связи с этим было замечено, что внесение небольших изменений в код для уменьшения частоты промахов приводит к непропорционально большому увеличению производительности. Можно предположить, что bzip2 будет иметь лучшую производительность на машинах с очень большими объёмами кэш-памяти.

ПРЕДОСТЕРЕЖЕНИЯ И РЕКОМЕНДАЦИИ

Сообщения об ошибках ввода-вывода не так полезны, как могли бы быть. bzip2 делает всё возможное для того, чтобы обнаружить ошибки ввода-вывода и корректно завершить работу, но подробности о сути возникшей проблемы иногда могут вводить в заблуждение.

Данная страница руководства относится к версии 1.0.8 программы bzip2. Сжатые данные, созданные этой версией, имеют полную прямую и обратную совместимость с предыдущими публичными выпусками версий 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 и выше, со следующим исключением: только версии 0.9.0 и выше способны правильно восстанавливать объединённые сжатые файлы. Версия 0.1pl2 не может этого делать; она завершит работу после восстановления первого файла в потоке.

В версиях bzip2recover до 1.0.2 для представления позиций битов в сжатых файлах использовались 32-разрядные целые числа, в связи с чем эти версии не могли обрабатывать сжатые файлы размером более 512 мегабайт. Версии 1.0.2 и выше используют 64-разрядные целые на некоторых платформах, где имеется их поддержка (целевые платформы, поддерживаемые GNU, а также Windows). Чтобы определить, была ли программа bzip2recover собрана с такими ограничениями, запустите её без аргументов. В любом случае вы можете самостоятельно собрать версию без ограничений, если сможете перекомпилировать её с параметром MaybeUInt64, заданным как беззнаковое 64-разрядное целое.

АВТОРЫ

Джулиан Сюард (Julian Seward), jseward@acm.org.

https://sourceware.org/bzip2/

Идеи, воплощённые в bzip2, принадлежат (по крайней мере) следующим людям: Майклу Барроузу (Michael Burrows) и Дэвиду Уилеру (David Wheeler) (за блочно-сортирующее преобразование), Дэвиду Уилеру (David Wheeler) (опять же, за кодировщик Хаффмана), Питеру Фенвику (Peter Fenwick) (за модель структурированного кодирования в оригинальной программе bzip, а также за многие улучшения) и Алистеру Моффату (Alistair Moffat), Рэдфорду Нилу (Radford Neal) и Иану Уиттену (Ian Witten) (за арифметический кодировщик в оригинальной программе bzip). Я очень признателен им за помощь, поддержку и советы. Обратитесь к руководству из дистрибутива с исходным кодом, чтобы получить ссылки на источники документации. Кристиан фон Рок (Christian von Roques) посоветовал мне подыскать более быстрые алгоритмы сортировки, чтобы ускорить сжатие. Бела Любкин (Bela Lubkin) рекомендовал улучшить производительность сжатия для худшего случая. Донна Робинсон (Donna Robinson) перевела документацию в формат XML. Сценарии bz* являются производными от соответствующих сценариев для GNU gzip. Многие люди присылали исправления, помогали с вопросами переносимости, одалживали компьютеры, давали советы и в целом были полезны.

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) Андрей Догадкин <adogadkin@outlook.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.