bzip2
使用 Burrows-Wheeler 块排序文本压缩算法, 将文件进行压缩, 压缩比率比一般算法高一些. bzip2 要求命令行标志附带一个文件名列表. 每个文件都被自己的压缩版本替换, 名称为 "original_name.bz2". 每个压缩文件与相应的原始文件具有相同的修改日期, 权限和所有权(如果可能的话), 因此可以在解压缩时正确地还原这些属性.
默认情况下, bzip2 和 bunzip2 不会覆盖现有文件. 如果希望发生这种情况, 请指定 "-f" 标志. 如果没有指定文件名, bzip2 将从标准输入压缩到标准输出. 在这种情况下, bzip2 拒绝将压缩输出写入终端, 因为这将是完全不可理解的, 因此毫无意义.
bunzip2(或 bzip2 -d)解压缩所有指定的文件. 未由 bzip2 创建的文件将被检测和忽略, 并发出警告. bzip2 试图从压缩文件中猜测解压缩文件的文件名, 如下所示:
- filename.bz2 becomes filename
- filename.bz becomes filename
- filename.tbz2 becomes filename.tar
- filename.tbz becomes filename.tar
- anyothername becomes anyothername.out
如果文件没有以. bz2,.bz,.tbz2 或. tbz 中的某个结尾, bzip2 抱怨它无法猜测原始文件的名称, 并使用原始名称并附加. out. 与压缩一样, 不提供文件名会导致从标准输入到标准输出的解压缩. bunzip2 将正确解压缩一个文件, 该文件是两个或多个压缩文件的级联. 其结果是连接相应的未压缩文件. 还支持连接压缩文件的完整性测试(-t).
还可以通过赋予 "-c" 标志将文件压缩或解压缩到标准输出. 可以像这样压缩和解压缩多个文件. 结果输出按顺序输入到 stdout. 以这种方式压缩多个文件会生成包含多个压缩文件表示的流. 这样的流只能通过 bzip2 版本 0.9.0 或更高版本正确地解压缩. 在解压缩流中的第一个文件后, bzip2 的早期版本将停止.
bzcat(或 bzip2 -dc)将所有指定的文件解压到标准输出. bzip2 将按照这个顺序从环境变量 BZIP2 和 BZIP 读取参数, 并在从命令行读取任何参数之前对它们进行处理. 这为提供默认参数提供了一种方便的方法.
压缩总是被执行, 即使压缩文件比原始文件稍大. 小于 100 个字节的文件往往会变大, 因为压缩机制在 50 个字节的范围内有一个恒定的开销. 随机数据 (包括大多数文件压缩器的输出) 编码大约为每字节 8.05 位, 扩展幅度约为 0.5%.
bzip2 使用 32 位 crc 来确保解压缩版本的文件与原始文件相同. 这可以防止压缩数据的损坏, 防止 bzip2 中未被检测到的 bug(希望非常不可能). 数据损坏的可能性是微乎其微的, 大约每处理 40 亿个文件就有一个机会. 但是, 请注意, 检查是在解压时发生的, 因此它只能告诉您某些事情是错误的. 它无法帮助您恢复原始未压缩数据. 您可以使用 bzip2recover 尝试从损坏的文件中恢复数据.
返回值: 0 表示正常退出, 1 表示环境问题(文件未找到, 无效标志, I/O 错误,&c),2 表示损坏的压缩文件, 3 表示内部一致性错误(例如, bug), 导致 bzip2 恐慌.
此命令的适用范围: RedHat,RHEL,Ubuntu,CentOS,SUSE,openSUSE,Fedora.
1, 语法
bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]
2, 选项列表
-h | --help
帮助信息
-V | --version
显示命令版本信息
-c | --stdout
将解压或者解压文件写到标准输出
-d | --decompress
解压
--z | -compress
对 - d 的补充: 强制压缩, 而不管调用名称如何
-t | --test
检查指定文件的完整性, 但不要解压缩它们. 这确实执行了一次尝试解压缩, 并丢弃了结果.
-f | --force
强制执行
-k | --keep
解压之后, 保留源文件
-s | --small
减少内存使用, 用于压缩, 解压缩和测试. 使用修改的算法对文件进行解压缩和测试, 该算法每个块字节只需要 2.5 字节. 这意味着任何文件都可以在 2300 k 内存中解压缩, 尽管速度是正常速度的一半.
在压缩期间,-s 选择 200 k 的块大小, 这将内存的使用限制在大约相同的数字上, 而代价是压缩比. 简而言之, 如果你的机器内存不足(8 兆字节或更少), 那就用 - s 来做所有的事情. 请参阅下面的内存管理.
-L | --license | -V | --version
列出 gzip 的许可证
-q | --quite
跳过所有的警告信息
-v | --verbose
显示详细执行过程
-1 ~-9
指定压缩比率, 将块大小设为 100k,200k,900K. 解压时无效,"-1" 等价于 "--fast","-9" 等价于 "--best".
-v | --verbose
显示执行过程
--
将所有后续参数视为文件名, 即使它们以'-'开头. 这样您就可以处理以'-'开头的文件, 例如:"bzip2 -- -myfilename".
- --repetitive-fast
- --repetitive-best
这些标志在 0.9.5 及以上版本中是多余的. 它们对早期版本中排序算法的行为提供了一些粗略的控制, 这有时是有用的. 0.9.5 及以上版本的改进算法使这些标志不相关
3, 内存管理
bzip2 以块压缩大型文件. 块大小既影响压缩比, 也影响压缩和解压缩所需的内存量. 标志 - 1 到 - 9 指定块大小分别为 100000 字节至 900000 字节 (默认值). 解压缩时, 从压缩文件的头读取用于压缩的块大小, 然后为其分配足够的内存来解压缩文件. 由于块大小存储在压缩文件中, 因此在解压缩过程中, 标志 - 1 至 - 9 与此无关, 因而被忽略. 压缩和解压缩需求(以字节为单位) 可估计为
- Compression: 400k + ( 8 x block size )
- Decompression: 100k + ( 4 x block size ), or 100k + ( 2.5 x block size )
更大的区块大小给出迅速递减的边际回报. 大部分压缩来自块大小的前两三百 k, 在小型机器上使用 bzip 2 时要记住这一点. 同样重要的是要认识到, 解压缩内存需求是通过选择块大小在压缩时间设置的.
对于默认的 900k 块大小压缩的文件, bunzip2 需要大约 3700 千字节来解压缩. 为了支持对 4MB 机器上的任何文件进行解压缩, bunzip2 可以选择使用大约一半的内存 (约 2300 千字节) 来解压缩. 解压缩速度也减半, 因此您应该只在必要时使用此选项. 相关的标志是 - s. 通常, 尝试并使用允许的最大块大小的内存约束, 因为这样可以最大限度地实现压缩. 压缩和解压缩速度几乎不受块大小的影响.
另一个要点适用于适合单个块的文件, 意味着大多数使用大块大小的文件. 接触到的实际内存量与文件大小成正比, 因为文件小于块. 例如, 使用标志 - 9 压缩一个文件的长度为 20000 字节, 将导致压缩器分配大约 7600k 的内存, 但只会触及 400k+20000*8=56 万字节的内存. 类似地, 解压缩程序将分配 3700k, 但只会触及 100k+20000*4=180 k 字节.
下面是一个表, 它总结了不同块大小的最大内存使用量
- 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
4, 从损坏的文件中恢复数据
bzip2 以块的形式压缩文件, 通常长达 900 千字节. 每个块都是独立处理的. 如果媒体或传输错误导致 multi-block .bz2 文件损坏, 则可以从文件中未损坏的块恢复数据. 每个块的压缩表示由一个 48 位模式分隔, 这使得以合理的确定性找到块边界成为可能. 每个块还带有自己的 32 位 CRC, 因此损坏的块可以与未损坏的块区分开来.
bzip2Recovery 是一个简单的程序, 其目的是搜索 ".bz2" 文件中的块, 并将每个块写入自己的 ".bz2" 文件中. 然后可以使用 "bzip2 -t" 测试结果文件的完整性, 并解压缩未损坏的文件.
bzip2Recovery 接受一个参数, 即受损文件的名称, 并写入一些文件 "rec00001file.bz2","rec00002file.bz2" 等, 其中包含提取的块. 输出文件名的设计使得在随后的处理中使用通配符. 例如,"bzip2 -dc rec*file.bz2 > recovered_data" 按正确的顺序处理文件.
处理大型 bz2 文件时, bzip2 恢复应该是最有用的, 因为这些文件将包含许多块. 在损坏的单块文件上使用它显然是徒劳无功的, 因为损坏的块无法恢复. 如果希望通过媒体或传输错误最大限度地减少任何潜在的数据丢失, 可以考虑使用较小的块大小进行压缩.
5, 执行情况说明
压缩的排序阶段收集文件中类似的字符串. 正因为如此, 包含大量重复符号的文件, 如 "aabaabaabaab."(重复几百次)可能比正常压缩速度慢. 在这方面, 0.9.5 及以上的版本比以前的版本要好得多. 最坏压缩时间与平均压缩时间之比在 10:1 左右. 对于以前的版本, 这个数字更像是 100:1. 如果需要, 可以使用 - vvvv 选项来非常详细地监视进度. 减压速度不受这些现象的影响.
bzip 2 通常分配几兆字节的内存进行操作, 然后以相当随机的方式对其进行充电. 这意味着压缩和解压缩的性能在很大程度上取决于您的机器能够为缓存丢失提供服务的速度. 正因为如此, 通过对代码进行小幅度的更改以降低漏出率, 从而提供了不成比例的大幅度性能改进. 我认为 bzip 2 在具有非常大缓存的机器上表现最好.
6, 实例
1)压缩文件
- [root@localhost weijie]# bzip2 1.c // 压缩 1.c, 源文件会被删除
- [root@localhost weijie]# ls
- 11.c 1.c.bz2 2.c 3.c 4.c 5.c 6.c~ bak
- [root@localhost weijie]# bzip2 -c 2.c > res.bz2 // 将 1.c 压缩到 res, 源文件不动
- [root@localhost weijie]# ls
- 11.c 1.c.bz2 2.c 3.c 4.c 5.c 6.c~ bak res.bz2
2)解压
- [root@localhost weijie]# bzip2 -d res.bz2 // 解压
- [root@localhost weijie]# ls
- 11.c 1.c.bz2 2.c 3.c 4.c 5.c 6.c~ bak res
3)将两个文件压缩到一个文件中
- [root@localhost weijie]# cat 1.c 2.c // 输出两个文件的内容
- hello world,
i am david.
i love Linux,
love code.
- 123
- 23
- 212
- [root@localhost weijie]# bzip2 -c 1.c > foo.gz // 将 1.c 压缩到 foo
- [root@localhost weijie]# bzip2 -c 2.c >> foo.gz // 将 2.c 压缩到 foo
- [root@localhost weijie]# bgzip2 -d foo.gz // 解压 foo
- [root@localhost weijie]# cat foo // 显示 foo 的内容
- hello world,
i am david.
i love Linux,
love code.
123
23
212
来源: https://yq.aliyun.com/articles/679044