- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
本文基于 linux-command 仓库的 command/bzip2.md 文档整理扩充,系统讲解 bzip2 的算法原理、命令行选项、文件命名规则、数据完整性校验与退出码,并覆盖 bunzip2、bzcat、bzgrep、bzip2recover 等 bzip2 家族配套命令的实战用法,帮你把 .bz2 压缩包的压缩、解压、校验、查看与修复流程一次掌握。
bzip2 是什么:算法定位与压缩率优势
bzip2是 Linux 系统中用于创建和管理(包括解压缩).bz2格式压缩包的命令。它采用Burrows-Wheeler 块排序文本压缩算法(BWT)与Huffman 编码组合的方式压缩文件:BWT 通过块排序把相似字符聚拢,再经前移编码(MTF)与游程编码(RLE)处理,最后由 Huffman 编码做熵编码,从而获得非常高的压缩率。
从压缩率角度看,bzip2 的表现一般比基于 LZ77/LZ78 的压缩软件(如 gzip、zip 的 deflate 算法)好得多,其性能接近 PPM 族统计类压缩软件。代价是压缩速度通常慢于 gzip——这是「高压缩率」与「速度」之间的经典取舍。
在设计上,bzip2 的命令行参数有意设计为非常接近 GNU gzip 的形式,但两者并不完全相同:gzip 支持-r递归压缩目录(详见 command/gzip.md),而 bzip2 只能针对单个文件操作;二者都只能压缩文件而不能「打包」目录,目录打包需要配合 tar 完成。
基本工作方式:文件替换、元数据保留与标准输入输出
bzip2 从命令行读入文件名和参数,每个文件被名为「原始文件名.bz2」的压缩文件替换。压缩产生的每个文件具有与原文件相同的修改时间、权限,如果可能的话还具有相同的属主,因此在解压缩时这些特性将被正确地恢复。这使 bzip2 在备份场景下能完整还原文件的元数据状态。
需要特别说明的边界情况:
- 在某些文件系统(如 MSDOS)中,没有权限、属主或时间的概念,或对文件名长度有严格限制,此时 bzip2 没有保持原文件名、属主、权限以及时间的机制——从这个意义上说,bzip2 对文件名的处理是「幼稚的」。
- bzip2 和 bunzip2 在缺省情况下不覆盖已有的文件,如果想覆盖已有的文件,必须指定
-f选项。 - 如果未指定文件名,bzip2 将压缩来自标准输入的数据并写往标准输出;在这种情况下,bzip2 会拒绝将压缩结果写往终端(因为这无法理解且没有意义),从而避免终端被二进制流污染。
语法与命令行选项全解析
语法格式
bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]核心选项对照表
| 选项 | 长选项 | 作用 |
|---|---|---|
-c | --stdout | 将数据压缩或解压缩至标准输出 |
-d | --decompress | 强制解压缩。bzip2、bunzip2 以及 bzcat 实际上是同一个程序,进行何种操作根据程序名确定;指定该选项后不考虑这一机制,强制进行解压缩 |
-z | --compress | -d的补充:强制进行压缩操作,而不管执行的是哪个程序 |
-t | --test | 检查指定文件的完整性,但并不对其解压缩(实际上会对数据做实验性解压缩,而不输出结果) |
-f | --force | 强制覆盖输出文件。通常 bzip2 不会覆盖已存在的文件;该选项还强制 bzip2 打破文件的硬连接(缺省情况下 bzip2 不会这么做) |
-k | --keep | 在压缩或解压缩时保留输入文件(不删除这些文件) |
-s | --small | 在压缩、解压缩及检查时减少内存用量(详见下方「内存管理」) |
-q | --quiet | 压制不重要的警告信息;I/O 错误及其它严重事件的信息不会被压制 |
-v | --verbose | 详尽模式,显示每个被处理文件的压缩率;命令行中更多的-v选项将增加详细程度,使 bzip2 显示出许多主要用于诊断目的的信息 |
-L | --license | 显示软件许可证条款及条件 |
-V | --version | 显示软件版本 |
-1~-9 | — | 在压缩时将块长度设为 100k、200k … 900k,对解压缩没有影响 |
-- | — | 将所有后面的命令行变量看作文件名,即使这些变量以减号-打头 |
--repetitive-fast | --repetitive-best | 这两个选项在 0.9.5 及其以上版本中是多余的;早期版本中它们对排序算法行为提供粗糙控制,0.9.5+ 采用改进算法后已无意义 |
压缩等级与内存管理
-1到-9控制压缩时的块长度(100k、200k … 900k),块长度越大,压缩率越高、内存占用越大、速度越慢。这与 gzip 的-1~-9语义类似(gzip 缺省为 6,参见 command/gzip.md)。
使用-s(--small)时采用一种修正的算法进行压缩和测试:
- 解压缩/测试时:每个数据块仅需要 2.5 个字节,这意味着任何文件都可以在2300k(约 2.3MB)内存中解压,尽管速度只有通常情况下的一半;
- 压缩时:
-s会选定 200k 的块长度,内存用量限制在 200k 左右,代价是压缩率降低。
实际建议:如果机器内存较少(8 兆字节或更少),可对所有操作都采用-s选项,在低内存环境下保证命令可用。
解压命名规则: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」作为解压缩文件名。
在压缩时同理:如果不提供文件名,bzip2 将从标准输入读取数据,压缩结果写往标准输出。
数据完整性:32 位 CRC 校验与退出码
bzip2 采用32 位 CRC 校验码作自我检查,以确认解压后的文件与原始文件相同。这可用于:
- 检测压缩文件是否损坏;
- 防止 bzip2 中未知的缺陷(可能性极小)。
数据损坏而未被检测到的几率非常之小,对于每个被处理的文件大约是四十亿分之一。检查是在解压缩时进行的,因此它只能说明「某个地方出问题了」,不能帮助恢复原始未压缩数据——若数据已损坏,需要用bzip2recover尝试从损坏的文件中恢复数据。
退出码含义
| 退出码 | 含义 |
|---|---|
0 | 正常退出 |
1 | 出现环境问题(文件未找到、非法的选项、I/O 错误等) |
2 | 压缩文件损坏 |
3 | 出现导致 bzip2 紧急退出的内部一致性错误(例如程序缺陷) |
在 Shell 脚本中可根据这些退出码区分「环境问题」「文件损坏」和「程序异常」三种不同的失败原因,从而采取不同的重试或告警策略。
实战实例:从压缩到校验的完整操作
1. 压缩指定文件
bzip2 filename # 或 bzip2 -z filename压缩时终端不会输出任何信息,原来的文件filename会被删除,替换成filename.bz2。行为细节:
- 如果以前已有
filename.bz2,则不会替换并提示错误(想要替换则指定-f,例如bzip2 -f filename); - 如果
filename是目录,则提示错误且不做任何操作; - 如果
filename已经是压缩过的(带 bz2 后缀),会提示一下不再压缩;没有 bz2 后缀则会再次压缩。
2. 解压指定的 .bz2 文件
bzip2 -d filename.bz2 # 或 bunzip2 filename.bz2解压时没有标准输出,原来的文件filename.bz2会被替换成filename。如果以前有filename则不会替换并提示错误(想要替换则指定-f,例如bzip2 -df filename.bz2)。
3. 显示压缩率等详细信息
bzip2 -v filename输出示例:
filename: 0.119:1, 67.200 bits/byte, -740.00% saved, 5 in, 42 out.其中0.119:1是压缩比,bits/byte表示每字节压缩后的比特数,saved为节省的百分比,in/out分别是输入输出字节数。解压时同理使用bzip2 -dv filename.bz2。
4. 模拟解压(完整性测试,不实际生成文件)
bzip2 -tv filename.bz2输出示例:
filename.bz2: ok-t指定进行模拟解压,不实际生成结果,相当于检查文件——即使目录下已有filename也不会产生错误输出,因为它根本不会真的解压文件。为了在屏幕上输出结果,这里加上了-v;如果是真的解压(bzip2 -dv filename.bz2),则输出的是把ok替换成done。
5. 压缩/解压时保留原始文件
bzip2 -k filename加上-k就保存原始文件了,否则原始文件会被结果文件替代。解压时同理:bzip2 -dk filename.bz2。
6. 解压到标准输出
bzip2 -dc filename.bz2输出示例:
hahahhaahahha使用-c指定输出到标准输出,屏幕上显示的是filename的内容,且不会删除filename.bz2。这在管道场景下非常实用,例如直接查看压缩日志:
bzip2 -dc access.log.bz2 | grep "ERROR"7. 压缩到标准输出与终端保护机制
bzip2 -c filename输出示例:
bzip2: I won't write compressed data to a terminal. bzip2: For help, type: `bzip2 --help'.使用-c指定压缩到标准输出且不删除原有文件,但压缩后的二进制数据无法输出到终端,这是 bzip2 刻意设计的终端保护机制。想将压缩流落盘,需配合重定向:bzip2 -c filename > filename.bz2。
8. 处理以减号开头的文件名
bzip2 -- -myfilename--之后的参数全部视为文件名,防止文件名中的-被误解析为选项。
bzip2 家族配套命令速览
bzip2 生态还包含一组配套命令,仓库中均有对应文档,可在 command 目录中查阅:
| 命令 | 用途 | 对应文档 |
|---|---|---|
bunzip2 | 解压缩.bz2文件;实为 bzip2 的符号链接(软链接),因此解压也可以通过bzip2 -d实现 | command/bunzip2.md |
bzcat | 不解压,直接显示.bz2压缩包解压后的内容 | command/bzcat.md |
bzmore | 分屏查看 bzip2 压缩的文本文件 | command/bzmore.md |
bzless | 增强版.bz2查看器,比 bzmore 功能更强 | command/bzless.md |
bzgrep | 用正则表达式直接搜索.bz2压缩包中的内容,匹配行输出到标准输出 | command/bzgrep.md |
bzcmp | 不真正解压,直接比较两个.bz2压缩包中的文件 | command/bzcmp.md |
bzdiff | 直接比较两个.bz2压缩包中文件的不同,省去解压后调用 diff 的过程 | command/bzdiff.md |
bzip2recover | 恢复被破坏的.bz2压缩包中的文件 | command/bzip2recover.md |
bunzip2 的常用选项
bunzip2(及 bzip2 -d)支持的选项与 bzip2 保持一致:
-f 或 --force # 解压缩时,若输出的文件与现有文件同名,预设不会覆盖,使用此参数强制覆盖 -k 或 --keep # 解压缩后预设会删除原压缩文件,使用此参数保留压缩文件 -s 或 --small # 降低程序执行时的内存使用量 -v 或 --verbose # 解压缩文件时显示详细信息 -l, --license, -V 或 --version # 显示版本信息批量压缩与解压的实战组合
对/opt目录下的etc.zip、var.zip和backup.zip进行压缩,设置压缩率为最高、压缩完毕后不删除原始文件、并显示详细过程:
bzip2 -9vk /opt/etc.zip /opt/var.zip /opt/backup.zip压缩完毕后,在/opt下生成etc.zip.bz2、var.zip.bz2和backup.zip.bz2。解压时:
bunzip2 -v /opt/etc.zip.bz2查看与搜索压缩文件
配合bzcat、bzmore、bzgrep可在不解压的情况下直接消费.bz2内容:
# 压缩文件(man.config 变为 man.config.bz2) bzip2 -z man.config # 直接读出压缩文件内容 bzcat man.config.bz2 # 在压缩包中按正则搜索 bzgrep "error" app.log.bz2损坏文件的恢复
bzip2 以**区块(block)**的方式压缩文件,每个区块视为独立的单位。因此,当某一区块损坏时,可以利用bzip2recover试着将文件中的区块隔离开来,以便解压缩正常的区块:
bzip2recover broken.bz2通常这适用于压缩文件很大的场景——大文件按块压缩时,损坏的往往只是个别区块,其余区块仍有恢复价值。
总结与速查
bzip2 是 Linux 下追求高压缩率的首选单文件压缩工具:它以 BWT + Huffman 算法获得优于 gzip 的压缩率,通过.bz2后缀自动完成文件替换,用 32 位 CRC 保证解压完整性,并以 0/1/2/3 四个退出码区分正常、环境错误、文件损坏与程序异常。核心记忆点:
- 压缩:
bzip2 [-1~-9] [-k] filename;保留原文件用-k,覆盖已有文件用-f; - 解压:
bunzip2 filename.bz2或bzip2 -d filename.bz2; - 校验:
bzip2 -tv filename.bz2,输出ok即完整; - 查看/搜索:
bzcat、bzmore、bzgrep免解压消费内容; - 修复:大文件损坏用
bzip2recover按区块抢救。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
Linux 7z 命令详解:7-Zip 高压缩比压缩与解压实战指南
Linux 7z 命令详解:7 Zip 高压缩比压缩与解压实战指南 7z 是开源压缩软件 7 Zip 在 Linux 平台的命令行前端(p7zip 包提供),以
文档教程Linux bunzip2 命令详解:用符号链接解压 .bz2 压缩包(linux-command 速查指南)
Linux bunzip2 命令详解:用符号链接解压 .bz2 压缩包(linux command 速查指南) bunzip2 是 Linux 系统中用于解压
文档教程linux-command 手册详解:bzcat 命令——不解压直接查看 .bz2 压缩文件内容
linux command 手册详解:bzcat 命令——不解压直接查看 .bz2 压缩文件内容 导读 bzcat 是 Linux 下 bzip2 压缩工具家族
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考