bzip2命令_Linux bzip2命令:壓縮和解壓檔案(.bz2檔案)

2020-07-16 10:04:31
有時候你會發現並不是所有的 Linux 壓縮包都是以 .tar.gz 為字尾的,有些壓縮包的字尾是 .tar.bz2。這個 .tar.bz2 又是什麼呢?它就是本文的主角:bzip2 壓縮工具。

有了 gzip 為什麼還要重複造輪子

gzip 的 0.1 版本是在 1992 年發布的,而 bzip2 的 0.1 版本是在 1996 年發布的,可見 bzip2 的開發是要晚於 gzip 的。由於 bzip2 與 gzip 相比,其壓縮穩定性和效果都更好,所以 bzip2 一經推出,便受到了廣大使用者的歡迎。

由此可見,這不能算是重複造輪子,bzip2 讓世界變得更加美好了。

bzip2 和 bunzip2 是一個東西麼

在我們正式開始講解之前,有一點必須要介紹清楚,那就是 bzip2 和 bunzip2 的關係。

其實從字面意思上我們也能夠猜出個大概,bzip2 是用來壓縮檔案的,而 bunzip2 則是用來解壓檔案的,類似於 zip 和 unzip 的關係。但是很神奇的一點是,其實 bzip2 和 bunzip2 在 Linux 中是指向完全一樣的程式的。

如果你在 Rehdat/Fedora/CentOS 下工作,你會發現 bunzip2 是 bzip2 的一個符號連線。
[[email protected] ruanjian]$ ls -Fhl /usr/bin/bunzip2
lrwxrwxrwx. 1 root root 5 2月   7 2012 /usr/bin/bunzip2 -> bzip2*

如果你在 Debian/Ubuntu 下工作,你會發現 bunzip2 和 bzip2 具有相同的 inode 節點,即兩者都指向同一個程式。
[email protected]:~# cat /etc/issue
Ubuntu 14.04.1 LTS n l

[email protected]:~# 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

[email protected]:~# 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 後 bzip2 無難度

如果你還沒有學習 gzip 的話,強烈推薦你先閱讀該網站上有關 gzip 的那篇文章。由於 bzip2 命令在用法上和 gzip 大同小異,所以如果你學習過 gzip 的話,那麼本文的內容相信你會輕鬆學懂,毫無難度。

解壓一個 .tar.bz2 的檔案。
[[email protected] 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選項去掉吧,照樣可以完美解壓:
[[email protected] 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
[[email protected] ruanjian]$ ls -l mynote.txt
-rw-rw-r-- 1 roc roc 96 2月  20 16:49 mynote.txt

#呼叫bzip2來壓縮, 壓縮後, 原來的檔案就會消失, 只會留下壓縮後的檔案
[[email protected] ruanjian]$ bzip2 mynote.txt

#壓縮後的檔案會以.bz2結尾
[[email protected] ruanjian]$ ls -l mynote.txt.bz2
-rw-rw-r-- 1 roc roc 46 2月  20 16:49 mynote.txt.bz2

#用bunzip2解壓, 當然也可以使用bzip2 -d來替換bunzip2
[[email protected] 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:
[[email protected] ~]$ bunzip2 A.txt.bz2 B.txt.bz2
[[email protected] ~]$ ls
A.txt B.txt

好了,截至目前,和 bzip2 相關的內容就介紹的差不多了,大家可以自己好好鑽研鑽研了。