命令行手册

Man » bzip2 手册在线 - 详细的 bzip2 手册页在线文档

🌍
bzip2, bunzip2 - 一种基于块排序的文本压缩算法,v1.0.8
bzcat - 将文件解压缩到标准输出
bzip2recover - 从损坏的 bzip2 文件中恢复数据

概要

bzip2 [ -cdfkqstvzVL123456789 ] [ 文件名 ... ]
bzip2 [ -h|--help ]
bunzip2 [ -fkvsVL ] [ 文件名 ... ]
bunzip2 [ -h|--help ]
bzcat [ -s ] [ 文件名 ... ]
bzcat [ -h|--help ]
bzip2recover 文件名

描述

bzip2 使用 Burrows-Wheeler 块排序文本压缩算法和哈夫曼编码来压缩文件。压缩效果通常比传统的基于 LZ77/LZ78 的压缩器好得多,并且接近于 PPM 系列统计压缩器的性能。

命令行选项与 GNU gzip 的选项非常相似,但并非完全相同。

bzip2 期望命令行标志后跟随一个文件列表。每个文件将被替换为其压缩版本,文件名为“原始名称.bz2”。每个压缩文件都具有与相应原始文件相同的修改日期、权限,并在可能的情况下具有相同的所有权,以便在解压缩时可以正确地恢复这些属性。文件名处理方式比较简单,即没有机制来在文件系统中保留原始文件名、权限、所有权或日期,这些文件系统可能缺少这些概念,或者具有严重的文件名长度限制,例如 MS-DOS。

bzip2 和 bunzip2 默认情况下不会覆盖现有文件。如果希望覆盖,请指定 -f 标志。

如果没有指定文件名,bzip2 将从标准输入压缩到标准输出。在这种情况下,bzip2 将拒绝将压缩输出写入终端,因为这完全无法理解,因此没有意义。

bunzip2(或 bzip2 -d)解压缩所有指定的文件。将检测并忽略那些未由 bzip2 创建的文件,并发出警告。bzip2 尝试根据以下方式从压缩文件的文件名中推断出解压缩文件的文件名:

filename.bz2   变为   filename
filename.bz    变为   filename
filename.tbz2  变为   filename.tar
filename.tbz   变为   filename.tar
anyothername   变为   anyothername.out

如果文件不以已识别的后缀结尾,即 .bz2、.bz、.tbz2 或 .tbz,bzip2 会抱怨无法推断原始文件名,并使用原始名称,并在其后附加 .out。

与压缩一样,不提供文件名会导致从标准输入解压缩到标准输出。

^ unzip2 可以正确解压缩由两个或多个压缩文件连接而成的文件。结果是相应未压缩文件的连接。还支持对连接的压缩文件进行完整性测试(-t)。

您还可以通过使用 -c 标志将文件压缩或解压缩到标准输出。可以像这样压缩和解压缩多个文件。结果输出将按顺序馈送到 stdout。以这种方式压缩多个文件会生成包含多个压缩文件表示形式的流。这样的流只能由 bzip2 版本 0.9.0 或更高版本正确解压缩。早期版本的 bzip2 在解压缩流中的第一个文件后停止。

^ zcat(或 bzip2 -dc)会将所有指定的文件解压缩到标准输出。

^ zip2 将从环境变量 BZIP2BZIP 中读取参数,按此顺序读取,并在读取命令行中的任何参数之前对其进行处理。这提供了一种方便的方式来提供默认参数。

始终执行压缩,即使压缩后的文件略大于原始文件。小于大约一百字节的文件往往会变大,因为压缩机制具有大约 50 字节的固定开销。随机数据(包括大多数文件压缩器的输出)以大约 8.05 位/字节的速率进行编码,导致膨胀约 0.5%。

作为一种自我检查以保护您的数据,bzip2 使用 32 位 CRC 来确保解压缩后的文件与原始文件相同。这可以防止压缩数据损坏,并防止 bzip2 中出现未检测到的错误(希望不太可能)。数据损坏未被检测到的几率非常小,约为每个处理的文件有四分之一的概率。但是,请注意,检查是在解压缩时进行的,因此它只能告诉您哪里出了问题。它无法帮助您恢复原始的未压缩数据。您可以使用 bzip2recover 尝试从损坏的文件中恢复数据。

返回值:0 表示正常退出,1 表示环境问题(文件未找到,无效标志,I/O 错误等),2 表示压缩文件已损坏,3 表示内部一致性错误(例如,错误),导致 bzip2 崩溃。

选项

`-c --stdout`

将文件压缩或解压缩到标准输出。

`-d --decompress`

强制解压缩。bzip2bunzip2bzcat 实际上是同一个程序,并且关于要执行的操作的决策是基于使用哪个名称来确定的。此标志会覆盖该机制,并强制 bzip2 进行解压缩。

`-z --compress`

^ d 的补充:无论调用名称如何,都强制进行压缩。

`-t --test`

检查指定文件的完整性,但不要解压缩它们。这实际上执行了一个试解压缩,并丢弃了结果。


-f --force

强制覆盖输出文件。通常,bzip2 不会覆盖现有的输出文件。同时,强制 bzip2 破坏指向文件的硬链接,否则它不会这样做。

bzip2 通常拒绝解压缩没有正确的文件头字节的文件。如果强制使用 (-f),它将直接传递这些文件而不进行修改。这与 GNU gzip 的行为方式相同。

-k --keep

在压缩或解压缩期间保留(不删除)输入文件。

-s --small

减少内存使用量,用于压缩、解压缩和测试。文件使用修改后的算法进行解压缩和测试,该算法只需要每块字节 2.5 字节。这意味着任何文件都可以在 2300 KB 的内存中解压缩,但速度大约是正常速度的一半。

在压缩期间,-s 选择 200 KB 的块大小,这将限制内存使用量到大约相同的水平,但会降低压缩比。简而言之,如果您的机器内存不足(8 MB 或更少),请对所有操作使用 -s。请参阅“内存管理”部分。

-q --quiet

抑制非必要的警告消息。与 I/O 错误和其他关键事件相关的消息不会被抑制。

-v --verbose

详细模式 - 显示每个处理文件的压缩比。进一步的 -v 选项会增加详细程度,并输出大量信息,这些信息主要用于诊断目的。

-h --help

打印帮助消息并退出。

-L --license -V --version

显示软件版本、许可条款和条件。

-1(或 --fast)到 -9(或 --best)

在压缩时,将块大小设置为 100 KB、200 KB ... 900 KB。在解压缩时,此选项无效。请参阅“内存管理”部分。--fast 和 --best 别名主要用于与 GNU gzip 兼容。特别是,--fast 选项不会显著提高速度。--best 选项只是选择默认行为。

--

将所有后续参数视为文件名,即使它们以连字符开头。这样就可以处理文件名以连字符开头的文件,例如:bzip2 -- -myfilename。

--repetitive-fast --repetitive-best

这些标志在 0.9.5 及更高版本中是多余的。它们在早期版本中提供对排序算法的一些粗略控制,有时这会很有用。0.9.5 及更高版本具有改进的算法,这使得这些标志变得无关紧要。

内存管理

bzip2 以块的形式压缩大文件。块大小会影响实现的压缩比以及压缩和解压缩所需的内存量。-1 到 -9 标志指定块大小为 100,000 字节到 900,000 字节(默认值)。在解压缩时,用于压缩的块大小会从压缩文件的头部读取,然后 bunzip2 会分配足够的内存来解压缩文件。由于块大小存储在压缩文件中,因此 -1 到 -9 标志在解压缩期间不相关,并且会被忽略。

压缩和解压缩所需的内存量(以字节为单位)可以估算如下:

压缩: 400 k + (8 x 块大小)

解压缩:100 k + (4 x 块大小),或者
100k + (2.5 x 块大小)

较大的块大小会迅速降低边际收益。大部分压缩效果来自于最初的几百 k 块大小,在使用 bzip2 压缩小文件时,这一点值得注意。 同样重要的是要理解,解压缩所需的内存量是在压缩时通过选择块大小来确定的。

对于使用默认 900 k 块大小压缩的文件,bunzip2 大约需要 3700 k 字节的内存来进行解压缩。 为了支持在 4 兆字节机器上解压缩任何文件,bunzip2 具有一个选项,可以使用大约一半的内存量(约 2300 k 字节)进行解压缩。 解压缩速度也会减半,因此您应该仅在必要时使用此选项。 相关的标志是 -s。

通常,尽量使用内存限制允许的最大块大小,因为这样可以最大限度地提高压缩效果。 压缩和解压缩速度几乎不受块大小的影响。

另一个重要点适用于那些适合单个块的文件——这意味着您在使用大块大小压缩时遇到的大多数文件。 实际使用的内存量与文件大小成比例,因为文件小于一个块。 例如,使用标志 -9 压缩 20000 字节的文件,压缩器将分配大约 7600 k 的内存,但实际上只使用 400 k + 20000 * 8 = 560 k 字节。 同样,解压缩器将分配 3700k,但实际上只使用 100 k + 20000 * 4 = 180 k 字节。

以下是一个表格,总结了不同块大小的最大内存使用量。 该表还记录了 Calgary 文本压缩语料库中 14 个文件(总计 3,141,622 字节)的总压缩大小。 此列可以让我们了解压缩如何随块大小而变化。 这些数字往往低估了对于较大文件,较大块大小的优势,因为该语料库主要包含较小的文件。

压缩 解压缩 解压缩 语料库 标志 使用量 使用量 -s 使用量 大小

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

从损坏文件中恢复数据

bzip2 压缩文件时以块为单位进行,通常每个块为 900 k 字节。 每个块都是独立处理的。 如果媒体或传输错误导致多块的 .bz2 文件损坏,则可能可以从文件中未损坏的块中恢复数据。

每个块的压缩表示都由一个 48 位模式分隔,这使得可以相当确定地找到块边界。每个块还携带自己的 32 位 CRC,因此可以区分损坏的块和未损坏的块。

^ zip2recover 是一个简单的程序,其目的是搜索 .bz2 文件中的块,并将每个块写入自己的 .bz2 文件中。然后,您可以使用 bzip2 -t 来测试结果文件的完整性,并解压缩未损坏的文件。

^ zip2recover 接受一个参数,即损坏文件的名称,并写入多个文件,如“rec00001file.bz2”、“rec00002file.bz2”等,其中包含提取的块。输出文件名设计为,以便在后续处理中使用通配符(例如,bzip2 -dc rec*file.bz2 > recovered_data),可以按正确的顺序处理这些文件。

^ zip2recover 最适合处理大型 .bz2 文件,因为这些文件将包含许多块。对于损坏的单个块文件,使用它显然是徒劳的,因为无法恢复损坏的块。如果您希望通过减少媒体或传输错误来尽量减少潜在的数据丢失,您可以考虑使用较小的块大小进行压缩。

性能说明

压缩过程中的排序阶段会将文件中相似的字符串聚集在一起。因此,包含非常长的重复符号的文件,如“aabaabaabaab ...”(重复数百次),其压缩速度可能比正常情况慢。版本 0.9.5 及更高版本在这方面比以前的版本表现更好。最坏情况和平均情况之间的压缩时间比约为 10:1。对于以前的版本,这个数字更像是 100:1。您可以使用 -vvvv 选项来详细监控进度,如果需要的话。

解压缩速度不受这些现象的影响。

^ zip2 通常会分配几兆字节的内存来运行,然后在其中以相当随机的方式进行操作。这意味着,对于压缩和解压缩,性能在很大程度上取决于您的机器服务缓存未命中的速度。因此,对代码进行小的更改以减少缓存未命中率,已被观察到可以带来不成比例的性能改进。我想 bzip2 在具有非常大的缓存的机器上表现最好。

注意事项

I/O 错误消息没有那么有用。bzip2 努力检测 I/O 错误并正常退出,但问题的详细信息有时看起来有些具有误导性。

此手册页适用于 bzip2 的 1.0.8 版本。此版本创建的压缩数据与以前的公共版本(版本 0.1pl2、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 兆字节的压缩文件。
0.2 及更高版本在某些支持它们的平台上(GNU 支持的目标平台和 Windows)使用 64 位整数。要确定 bzip2recover 是否使用这种限制进行构建,请在不带参数的情况下运行它。无论如何,如果您可以重新编译它,并设置 MaybeUInt64 为无符号 64 位整数,您都可以构建一个不受限制的版本。

作者

朱利安·休华德,_。

https://sourceware.org/bzip2/

bzip2 中包含的思想归功于(至少)以下人员:迈克尔·伯罗斯和戴维·惠勒(用于块排序转换)、戴维·惠勒(再次,用于哈夫曼编码器)、彼得·芬威克(用于原始 bzip 中的结构化编码模型以及许多改进),以及阿拉斯泰尔·莫法特、拉德福德·尼尔和伊恩·威滕(用于原始 bzip 中的算术编码器)。我非常感谢他们的帮助、支持和建议。有关文档来源的更多信息,请参阅源代码分发中的手册。克里斯蒂安·冯·罗克鼓励我寻找更快的排序算法,以加快压缩速度。贝拉·卢布金鼓励我改进最坏情况下的压缩性能。多娜·罗宾逊将文档转换为 XML 格式。bz* 脚本源自 GNU gzip 的脚本。许多人发送了补丁,帮助解决了可移植性问题,借出了机器,提供了建议,并提供了各种帮助。