块排序的文件压缩器
命令语法格式
bzip2 [ -cdfkqstvzVL123456789 ] [ filenames … ]
bzip2 [ -h|–help ]
bunzip2 [ -fkvsVL ] [ filenames … ]
bunzip2 [ -h|–help ]
bzcat [ -s ] [ filenames … ]
bzcat [ -h|–help ]
bzip2recover filename
命令描述
实际上bzip2、bunzip2、bzcat是相同的程序,根据调用名的不同来决定采取什么操作。
bzip2: 块排序的文件压缩器
命令bzip2使用“Burrows-Wheeler块排序文本压缩“算法和“Huffman编码”压缩文件。压缩通常比通过更传统的基于LZ77/LZ78的压缩器实现的压缩要好得多,并且接近PPM系列统计压缩器的性能。
命令行选项与GNU的gzip的命令行选项非常相似,但它们并不完全相同。
命令bzip2期望命令行标志附带一个文件名列表。每个文件都由其自身的压缩版本替换,名称为“original_name.bz2”。每个压缩文件具有相同的修改日期、权限、具有相应原始的所有权(在可能的情况下),以便可以在解压缩时正确恢复这些属性。文件名处理是简单的,因为没有机制来保存缺少这些概念的文件系统中的原始文件名、权限、所有权、日期,或者具有严重的文件名长度限制,例如MS-DOS。
如果未指定文件名,则bzip2将从标准输入读取数据,压缩结果写入标准输出。在这种情况下,命令bzip2将拒绝将压缩输出写入终端,因为这将是完全不可理解的,因此毫无意义。
命令bzip2将按顺序读取环境变量BZIP2和BZIP中的参数,并在从命令行读取任何参数之前处理它们。这提供了一种提供默认参数的便捷方法。
bunzip2(bzip2 -d): 解压bzip2文件
命令bunzip2解压所有指定的文件。如果文件不是由bzip2创建的,则会忽略该文件并发出警告。命令bzip2尝试从压缩文件的文件名中猜出解压缩文件的文件名,如下所示:
filename.bz => filename
filename.tbz2 => filename.tar
filename.tbz => filename.tar
anyothername => anyothername.out
如果文件没有以识别的结尾之一(.bz2,.bz,.tbz2,.tbz)结尾,则bzip2会”抱怨“无法猜出原始文件的名称,并使用附加了.out的原始名称。
与bzip2一样,不提供文件名给bunzip2会导致bunzip2从标准输入读取,将解压结果写入标准输出。
对于由两个或多个压缩文件的串联的文件,命令bunzip2将正确解压它们。结果是相应的未压缩文件的串联。还支持串联压缩文件的完整性测试(-t)。
bzcat(bzip2 -dc): 解压文件到标注输出
命令bzcat将所有指定的文件解压缩到标准输出。
bzip2recover: 从损坏的bzip2文件中恢复数据
作为保护的自检,命令bzip2使用32位CRC来确保文件的解压缩版本与原始文件相同。这样可以防止压缩数据损坏,并防止bzip2中出现未检测到的错误(希望非常不可能)。未检测到数据损坏的可能性微不足道,对于每个处理一个文件大约有四十亿分之一的机会。但请注意,检查是在解压缩时发生的,因此它只能告诉您出现问题。它无法帮助您恢复原始的未压缩数据。您可以使用bzip2recover尝试从损坏的文件中恢复数据。
命令支持的选项及含义
-c –stdout
将文件压缩或解压缩写入标准输出。可以像这样压缩和解压缩多个文件。输出结果将按顺序写入标准输出。以这种方式压缩多个文件会生成包含多个压缩文件表示的流。这样的流只能通过bzip2 0.9.0+的版本正确解压缩。在解压缩流中的第一个文件后,早期版本的bzip2将停止。
-d –decompress
强制进行解压,无论调用名是什么。
-z –compress
强制执行压缩,无论调用名是什么。
-t –test
检查指定文件的完整性,但不要解压缩它们。这确实执行了试验解压,并丢弃了结果。
-f –force
默认情况下,命令bzip2和bunzip2不会覆盖已存在的文件。指定-f选项会强制覆盖已经存在的文件,并强制bzip2打破文件的硬链接,否则它不会这样做。
命令bzip2通常拒绝解压魔术头字节不正确的文件。但是,如果强制(-f),它将通过未修改传递此类文件。这就是GNU gzip的行为方式。
-k –keep
在压缩或解压缩期间保留(不删除)输入文件。
-s –small
减少用于压缩、解压、测试的内存使用量。 使用修改的算法对文件进行解压、测试,该算法的每块字节仅需要2.5个字节。这意味着任何文件都可以在2300k的内存中解压缩,尽管大约是正常速度的一半。
在压缩期间,选项-s选择200k的块大小,这会将内存使用限制在大约相同的数字,这会以”压缩比“为代价。 简而言之,如果您的计算机内存不足(8兆字节或更少),请为所有内容使用”-s“。请参阅下面的「内存管理」部分。
-1 (or –fast) to -9 (or –best)
压缩时,将块大小设置为100k,200k … 900k。解压时,该选项无效。
请参阅下面的「内存管理」部分。–fast和–best别名主要用于与GNU的gzip兼容。特别是,选项–fast不会使事情明显加快,而且–best只选择默认行为。
—
将该选项的所有后续参数视为文件名,即使它们以短划线开头。这是一种很常见的做法。这样您就可以处理名称以短划线开头的文件了,例如:bzip2 — -myfilename
控制输出消息
-q –quiet
禁止输出非必要的警告消息。与I/O错误和其他关键事件有关的消息则不会被抑制。
-v –verbose
详细模式,显示处理的每个文件的压缩率。多个-v选项会增加输出信息的详细程度,会输出许多用于诊断目的的信息。
其他选项
–repetitive-fast –repetitive-best
这些标志在0.9.5+中是多余的。他们在早期版本中对排序算法的行为提供了一些粗略的控制,这有时很有用。在0.9.5及更高版本有一个改进的算法,使这些标志无关紧要。
-h –help
显示帮助信息。
-L –license -V –version
显示版本或者证书信息。
内存管理
命令bzip2压缩块中的大文件。块大小影响所实现的压缩率,及压缩和解压缩所需的内存量。标志-1到-9分别将块大小指定为100,000字节到900,000字节(默认值)。 在解压缩时,从压缩文件的头部读取用于压缩的块大小,然后bunzip2分配足够的内存来解压缩文件。 由于块大小存储在压缩文件中,因此解压缩期间标记-1到-9并无作用,因此被忽略。
压缩和解压缩要求(以字节为单位)可以估算为:
较大的块大小会使边际收益迅速减少。大多数压缩来自块大小的前200k或300k,在小型机器上使用bzip2时要记住这个事实。 同样重要的是要理解:解压时的内存要求是在压缩时通过指定块大小来设置的。
对于使用默认块大小(900k)压缩的文件,bunzip2将需要大约3700KB进行解压缩。为了支持4MB机器上任何文件的解压缩,bunzip2可以选择使用大约一半的内存量进行解压缩,大约2300KB。解压缩速度也会减半,因此您只应在必要时使用此选项。相关是-s选项。
通常,尝试并使用内存约束允许的最大块大小,因为这样可以最大化压缩。压缩和解压缩速度几乎不受块大小的影响。
另一个重点适用于:纳入单个块的文件 – 这意味着您遇到的大多数文件使用大块大小。触摸的实际内存量与文件大小成比例,因为文件大小小于一个块的大小。例如,使用标志-9压缩20,000B长的文件将导致压缩器分配大约7600KB的内存,但仅触摸400KB + 20000 * 8 = 560KB。类似地,解压缩器将分配3700KB,但仅触摸100k + 20000 * 4 = 180KB。
下表总结了不同块大小的最大内存使用情况。 还记录了“卡尔加里文本压缩语料库”(Calgary Text Compression Corpus)的14个文件的总压缩大小,总计3,141,622字节。 此列给出了压缩如何随块大小而变化的一些感觉。 这些数字倾向于低估较大块文件的较大块的优势,因为语料库由较小的文件占主导地位。
Compress Decompress Decompress Corpus Flag usage usage -s usage Size -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以块为单位压缩文件,通常为900KB。每个块都是独立处理的。如果介质或传输错误导致多块的bzip2文件损坏,则可以从文件中未损坏的块恢复数据。
每个块的压缩表示由48位模式分隔,这使得可以合理确定地找到块边界。每个块还带有自己的32位CRC,因此可以将损坏的块与未损坏的块区分开来。
命令bzip2recover是一个简单的程序,其目的是搜索.bz2文件中的块,并将每个块写入其自己的.bz2文件中。然后,您可以使用bzip2 -t测试生成的文件的完整性,并解压缩那些未损坏的文件。
命令bzip2recover接受一个参数,即受损文件的名称,并写入许多文件“rec00001file.bz2”,“rec00002file.bz2”等,这其中包含提取的块。输出文件名的设计使得在后续处理中可以使用通配符,例如,“bzip2 -dc rec * file.bz2 > restored_data”,以正确的顺序处理文件。
命令bzip2recover应该是处理大型.bz2文件的最常用的,因为它们包含许多块。在损坏的单块文件上使用它显然是徒劳的,因为损坏的块无法恢复。如果您希望通过介质或传输错误最大限度地减少任何潜在的数据丢失,您可以考虑使用较小的块大小进行压缩。
性能说明
压缩的排序阶段将文件中的类似字符串收集在一起。因此,包含很长一段重复符号的文件,如“aabaabaabaab ……”(重复几百次)可能比正常情况下压缩得慢。在这方面,版本0.9.5及更高版本比以前的版本好得多。最坏情况和平均情况压缩时间之间的比率在10:1的范围内。对于以前的版本,这个数字更像是100:1。如果需要,可以使用-vvvv选项详细监视进度。
解压速度不受这些现象的影响。
bzip2通常会分配几兆字节的内存来运行,然后以相当随机的方式对其进行全额收费。这意味着压缩和解压缩的性能很大程度上取决于您的机器可以处理缓存未命中的速度。因此,已经观察到对代码进行小的改变以降低未命中率,从而提供不成比例的大的性能改进。我想bzip2在具有非常大的缓存的机器上表现最佳。
注意事项
I/O错误消息没有它们可能有用。 bzip2努力检测I/O错误并彻底退出,但问题的细节有时似乎相当具有误导性。
本手册页面适用于bzip2的1.0.6版。此版本创建的压缩数据完全向前和向后兼容以前的公共版本,版本0.1pl2、0.9.0、0.9.5、1.0.0、1.0.1、1.0.2及更高版本,但有以下例外:0.9.0及以上版本可以正确解压缩多个连锁压缩文件。0.1pl2不能这样做;在解压缩流中的第一个文件后,它将停止。
在1.0.2之前的bzip2recover版本使用32位整数来表示压缩文件中的位位置,因此它们无法处理超过512MB的压缩文件。版本1.0.2及更高版本在支持它们的某些平台(GNU支持的目标和Windows)上使用64位整数。要确定bzip2recover是否构建了这样的限制,请在不带参数的情况下运行它。在任何情况下,如果可以使用设置为无符号64位整数的MaybeUInt64重新编译它,则可以构建自己的无限制版本。
即使压缩文件略大于原始文件,也始终执行压缩。小于大约一百字节的文件往往会变大,因为压缩机制在50字节的区域中具有恒定的开销。随机数据(包括大多数文件压缩器的输出)以每字节大约8.05位编码,扩展大约0.5%。
退出状态
0 正常退出
1 环境问题(找不到文件、无效标志、I/O错误等等)
2 损坏的压缩文件
3 内部一致性错误导致bzip2发生错误。例如,bug
参考文献
- man 1 bzip2, Version 1.0.6-8.1
更新日志
- 08/13/2018 创建文章