有时候你会发现并不是所有的 Linux 压缩包都是以 .tar.gz 为后缀的,有些压缩包的后缀是 .tar.bz2。这个 .tar.bz2 又是什么呢?它就是本文的主角:bzip2 压缩工具。
gzip 的 0.1 版本是在 1992 年发布的,而 bzip2 的 0.1 版本是在 1996 年发布的,可见 bzip2 的开发是要晚于 gzip 的。由于 bzip2 与 gzip 相比,其压缩稳定性和效果都更好,所以 bzip2 一经推出,便受到了广大用户的欢迎。
由此可见,这不能算是重复造轮子,bzip2 让世界变得更加美好了。
在我们正式开始讲解之前,有一点必须要介绍清楚,那就是 bzip2 和 bunzip2 的关系。
其实从字面意思上我们也能够猜出个大概,bzip2 是用来压缩文件的,而 bunzip2 则是用来解压文件的,类似于 zip 和 unzip 的关系。但是很神奇的一点是,其实 bzip2 和 bunzip2 在 Linux 中是指向完全一样的程序的。
如果你在 Rehdat/Fedora/CentOS 下工作,你会发现 bunzip2 是 bzip2 的一个符号连接。
[roc@roclinux ruanjian]$ ls -Fhl /usr/bin/bunzip2 lrwxrwxrwx. 1 root root 5 2月 7 2012 /usr/bin/bunzip2 -> bzip2*
如果你在 Debian/Ubuntu 下工作,你会发现 bunzip2 和 bzip2 具有相同的 inode 节点,即两者都指向同一个程序。
root@rocubuntu75:~# cat /etc/issue Ubuntu 14.04.1 LTS \n \l root@rocubuntu75:~# ls -hl /bin/bunzip2 /bin/bzip2 -rwxr-xr-x 3 root root 31K Oct 21 2013 /bin/bunzip2 -rwxr-xr-x 3 root root 31K Oct 21 2013 /bin/bzip2 root@rocubuntu75:~# ls -i /bin/bunzip2 /bin/bzip2 131078 /bin/bunzip2 131078 /bin/bzip2
但是 bzip2 和 bunzip2 两个命令的行为确实完全迥异,bzip2 只服务于那些“要压缩的文件”,而 bunzip2 则只服务于那些“要解压缩的文件”。
一个程序,改个名竟然就可以有不同的行为,这是怎么实现的?通过阅读 bzip2 软件包的源代码,我们找到了精髓所在。
/* 默认情况下, 命令的工作模式是OM_Z, 即压缩模式 */ opMode = OM_Z; /* 如果程序的名字中含有unzip或UNZIP, 那么就将命令的工作模式设置成OM_UNZ, 即解压模式 */ if ( (strstr ( progName, "unzip" ) != 0) || (strstr ( progName, "UNZIP" ) != 0) ) opMode = OM_UNZ;
这下,真相大白于天下啦!
本来不想告诉大家这个小秘密的,因为就好像魔术,一旦揭穿,就会变得索然无味了。哈哈,我们还是抓紧时间进入命令用法环节吧。
如果你还没有学习 gzip 的话,强烈推荐你先阅读该网站上有关 gzip 的那篇文章。由于 bzip2 命令在用法上和 gzip 大同小异,所以如果你学习过 gzip 的话,那么本文的内容相信你会轻松学懂,毫无难度。
解压一个 .tar.bz2 的文件。
[roc@roclinux ruanjian]$ tar -xjvf curl-7.47.1.tar.bz2 curl-7.47.1/tests/unit/unit1301.c curl-7.47.1/tests/unit/unit1305.c curl-7.47.1/tests/unit/Makefile.am curl-7.47.1/tests/unit/Makefile.in curl-7.47.1/tests/unit/unit1300.c (此处省略数百行)
此处的用法和 gzip 几乎一样,唯一的区别就是采用了-j选项。-j选项特指采用 bzip2 方式进行解压缩。
相信你也已经猜到了,打包并压缩的方法,就是 -cjvf,唯一的区别还是那个-j选项而已,我们就不在这里浪费笔墨举例了。
再告诉大家一个小秘密,现在 tar 命令已经足够智能了,我们完全不需要指定解压缩方式,tar 就会根据文件后缀来自动采用匹配的解压方法。
大胆的把-j选项去掉吧,照样可以完美解压:
[roc@roclinux ruanjian]$ tar -xvf curl-7.47.1.tar.bz2 curl-7.47.1/tests/unit/unit1301.c curl-7.47.1/tests/unit/unit1305.c curl-7.47.1/tests/unit/Makefile.am curl-7.47.1/tests/unit/Makefile.in curl-7.47.1/tests/unit/unit1300.c (此处省略数百行)
我们用 bzip2 命令和 bunzip2 命令,就可以实现了,来看实例。
#一个文本文件, 叫作mynote.txt [roc@roclinux ruanjian]$ ls -l mynote.txt -rw-rw-r-- 1 roc roc 96 2月 20 16:49 mynote.txt #调用bzip2来压缩, 压缩后, 原来的文件就会消失, 只会留下压缩后的文件 [roc@roclinux ruanjian]$ bzip2 mynote.txt #压缩后的文件会以.bz2结尾 [roc@roclinux ruanjian]$ ls -l mynote.txt.bz2 -rw-rw-r-- 1 roc roc 46 2月 20 16:49 mynote.txt.bz2 #用bunzip2解压, 当然也可以使用bzip2 -d来替换bunzip2 [roc@roclinux ruanjian]$ bunzip2 mynote.txt.bz2
如果有 A.txt 和 B.txt 两个文件,而我想用一个命令把两个文件分别压缩为 A.txt.bz2 和 A.txt.bz2:
# bzip2 abc1.txt abc2.txt
如果有 A.txt.bz2 和 B.txt.bz2 两个文件,而我想用一个命令把两个文件分别解压为 A.txt 和 B.txt:
[roc@roclinux ~]$ bunzip2 A.txt.bz2 B.txt.bz2 [roc@roclinux ~]$ ls A.txt B.txt
好了,截至目前,和 bzip2 相关的内容就介绍的差不多了,大家可以自己好好钻研钻研了。