## 8.2 Linux 系統常見的壓縮指令
在Linux的環境中,壓縮文件的擴展名大多是:“*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz”,為什么會有這樣的擴展名呢?不是說 Linux 的擴展名沒有什么作用嗎?
這是因為 Linux 支持的壓縮指令非常多,且不同的指令所用的壓縮技術并不相同,當然彼此之間可能就無法互通壓縮/解壓縮文件啰。 所以,當你下載到某個壓縮文件時,自然就需要知道該文件是由哪種壓縮指令所制作出來的,好用來對照著解壓縮啊! 也就是說,雖然 Linux 文件的屬性基本上是與文件名沒有絕對關系的, 但是為了幫助我們人類小小的腦袋瓜子,所以適當的擴展名還是必要的! 下面我們就列出幾個常見的壓縮文件擴展名吧:
```
*.Z compress 程序壓縮的文件;
*.zip zip 程序壓縮的文件;
*.gz gzip 程序壓縮的文件;
*.bz2 bzip2 程序壓縮的文件;
*.xz xz 程序壓縮的文件;
*.tar tar 程序打包的數據,并沒有壓縮過;
*.tar.gz tar 程序打包的文件,其中并且經過 gzip 的壓縮
*.tar.bz2 tar 程序打包的文件,其中并且經過 bzip2 的壓縮
*.tar.xz tar 程序打包的文件,其中并且經過 xz 的壓縮
```
Linux上常見的壓縮指令就是 gzip, bzip2 以及最新的 xz ,至于 compress 已經退流行了。為了支持 windows 常見的 zip,其實 Linux 也早就有 zip 指令了! gzip 是由 [GNU 計劃](http://www.gnu.org/)所開發出來的壓縮指令,該指令已經取代了 compress 。 后來 GNU 又開發出 bzip2 及 xz 這幾個壓縮比更好的壓縮指令!不過,這些指令通常僅能針對一個文件來壓縮與解壓縮,如此一來, 每次壓縮與解壓縮都要一大堆文件,豈不煩人?此時,那個所謂的“打包軟件, tar”就顯的很重要啦!
這個 tar 可以將很多文件“打包”成為一個文件!甚至是目錄也可以這么玩。不過,單純的 tar 功能僅是“打包”而已,亦即是將很多文件集結成為一個文件, 事實上,他并沒有提供壓縮的功能,后來,[GNU 計劃](http://www.gnu.org/)中,將整個 tar 與壓縮的功能結合在一起,如此一來提供使用者更方便并且更強大的壓縮與打包功能! 下面我們就來談一談這些在 Linux 下面基本的壓縮指令吧!
### 8.2.1 gzip, zcat/zmore/zless/zgrep
gzip 可以說是應用度最廣的壓縮指令了!目前 gzip 可以解開 compress, zip 與 gzip 等軟件所壓縮的文件。 至于 gzip 所創建的壓縮文件為 *.gz 的文件名喔!讓我們來看看這個指令的語法吧:
```
[dmtsai@study ~]$ gzip [-cdtv#] 文件名
[dmtsai@study ~]$ zcat 文件名.gz
選項與參數:
-c :將壓縮的數據輸出到屏幕上,可通過數據流重導向來處理;
-d :解壓縮的參數;
-t :可以用來檢驗一個壓縮文件的一致性~看看文件有無錯誤;
-v :可以顯示出原文件/壓縮文件的壓縮比等信息;
-# :# 為數字的意思,代表壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!默認是 -6
范例一:找出 /etc 下面 (不含子目錄) 容量最大的文件,并將它復制到 /tmp ,然后以 gzip 壓縮
[dmtsai@study ~]$ ls -ldSr /etc/* # 忘記選項意義?請自行 man 啰!
.....(前面省略).....
-rw-r--r--. 1 root root 25213 Jun 10 2014 /etc/dnsmasq.conf
-rw-r--r--. 1 root root 69768 May 4 17:55 /etc/ld.so.cache
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
[dmtsai@study ~]$ cd /tmp
[dmtsai@study tmp]$ cp /etc/services .
[dmtsai@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
[dmtsai@study tmp]$ ll /etc/services /tmp/services*
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 dmtsai dmtsai 136088 Jun 30 18:40 /tmp/services.gz
```
當你使用 gzip 進行壓縮時,在默認的狀態下原本的文件會被壓縮成為 .gz 的文件名,原始文件就不再存在了。 這點與一般習慣使用 windows 做壓縮的朋友所熟悉的情況不同喔!要注意!要注意! 此外,使用 gzip 壓縮的文件在 Windows 系統中,竟然可以被 WinRAR/7zip 這個軟件解壓縮呢!很好用吧!至于其他的用法如下:
```
范例二:由于 services 是文本文件,請將范例一的壓縮文件的內容讀出來!
[dmtsai@study tmp]$ zcat services.gz
# 由于 services 這個原本的文件是是文本文件,因此我們可以嘗試使用 zcat/zmore/zless 去讀取!
# 此時屏幕上會顯示 servcies.gz 解壓縮之后的原始文件內容!
范例三:將范例一的文件解壓縮
[dmtsai@study tmp]$ gzip -d services.gz
# 鳥哥不要使用 gunzip 這個指令,不好背!使用 gzip -d 來進行解壓縮!
# 與 gzip 相反, gzip -d 會將原本的 .gz 刪除,回復到原本的 services 文件。
范例四:將范例三解開的 services 用最佳的壓縮比壓縮,并保留原本的文件
[dmtsai@study tmp]$ gzip -9 -c services > services.gz
范例五:由范例四再次創建的 services.gz 中,找出 http 這個關鍵字在哪幾行?
[dmtsai@study tmp]$ zgrep -n 'http' services.gz
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol
.....(下面省略).....
```
其實 gzip 的壓縮已經最優化過了,所以雖然 gzip 提供 1~9 的壓縮等級,不過使用默認的 6 就非常好用了! 因此上述的范例四可以不要加入那個 -9 的選項。范例四的重點在那個 -c 與 > 的使用啰!-c 可以將原本要轉成壓縮文件的數據內容,將它變成文字類型從屏幕輸出, 然后我們可以通過大于 (>) 這個符號,將原本應該由屏幕輸出的數據,轉成輸出到文件而不是屏幕,所以就能夠創建出壓縮擋了。只是文件名也要自己寫, 當然最好還是遵循 gzip 的壓縮文件名要求較佳喔!!更多的 > 這個符號的應用,我們會在 bash 章節再次提及!
cat/more/less 可以使用不同的方式來讀取純文本文件,那個 zcat/zmore/zless 則可以對應于 cat/more/less 的方式來讀取純文本文件被壓縮后的壓縮文件! 由于 gzip 這個壓縮指令主要想要用來取代 compress 的,所以不但 compress 的壓縮文件可以使用 gzip 來解開,同時 zcat 這個指令可以同時讀取 compress 與 gzip 的壓縮文件呦!
另外,如果你還想要從文字壓縮文件當中找數據的話,可以通過 egrep 來搜尋關鍵字喔!而不需要將壓縮文件解開才以 grep 進行! 這對查詢備份中的文本文件數據相當有用!

**Tips** 時至今日,應該也沒有人愛用 compress 這個老老的指令了!因此,這一章已經拿掉了 compress 的介紹~而如果你還有備份數據使用的是 compress 創建出來的 .Z 文件,那也無須擔心,使用 znew 可以將該文件轉成 gzip 的格示喔!
### 8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep
若說 gzip 是為了取代 compress 并提供更好的壓縮比而成立的,那么 bzip2 則是為了取代 gzip 并提供更佳的壓縮比而來的。 bzip2 真是很不錯用的東西~這玩意的壓縮比竟然比 gzip 還要好~至于 bzip2 的用法幾乎與 gzip 相同!看看下面的用法吧!
```
[dmtsai@study ~]$ bzip2 [-cdkzv#] 文件名
[dmtsai@study ~]$ bzcat 文件名.bz2
選項與參數:
-c :將壓縮的過程產生的數據輸出到屏幕上!
-d :解壓縮的參數
-k :保留原始文件,而不會刪除原始的文件喔!
-z :壓縮的參數 (默認值,可以不加)
-v :可以顯示出原文件/壓縮文件的壓縮比等信息;
-# :與 gzip 同樣的,都是在計算壓縮比的參數, -9 最佳, -1 最快!
范例一:將剛剛 gzip 范例留下來的 /tmp/services 以 bzip2 壓縮
[dmtsai@study tmp]$ bzip2 -v services
services: 5.409:1, 1.479 bits/Byte, 81.51% saved, 670293 in, 123932 out.
[dmtsai@study tmp]$ ls -l services*
-rw-r--r--. 1 dmtsai dmtsai 123932 Jun 30 18:40 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
# 此時 services 會變成 services.bz2 之外,你也可以發現 bzip2 的壓縮比要較 gzip 好喔!!
# 壓縮率由 gzip 的 79% 提升到 bzip2 的 81% 哩!
范例二:將范例一的文件內容讀出來!
[dmtsai@study tmp]$ bzcat services.bz2
范例三:將范例一的文件解壓縮
[dmtsai@study tmp]$ bzip2 -d services.bz2
范例四:將范例三解開的 services 用最佳的壓縮比壓縮,并保留原本的文件
[dmtsai@study tmp]$ bzip2 -9 -c services > services.bz2
```
看上面的范例,你會發現到 bzip2 連選項與參數都跟 gzip 一模一樣!只是擴展名由 .gz 變成 .bz2 而已!其他的用法都大同小異,所以鳥哥就不一一介紹了! 你也可以發現到 bzip2 的壓縮率確實比 gzip 要好些!不過,對于大容量文件來說,bzip2 壓縮時間會花比較久喔!至少比 gzip 要久的多! 這沒辦法~要有更多可用容量,就得要花費相對應的時間!還 OK 啊!
### 8.2.3 xz, xzcat/xzmore/xzless/xzgrep
雖然 bzip2 已經具有很棒的壓縮比,不過顯然某些自由軟件開發者還不滿足,因此后來還推出了 xz 這個壓縮比更高的軟件!這個軟件的用法也跟 gzip/bzip2 幾乎一模一樣! 那我們就來瞧一瞧!
```
[dmtsai@study ~]$ xz [-dtlkc#] 文件名
[dmtsai@study ~]$ xcat 文件名.xz
選項與參數:
-d :就是解壓縮啊!
-t :測試壓縮文件的完整性,看有沒有錯誤
-l :列出壓縮文件的相關信息
-k :保留原本的文件不刪除~
-c :同樣的,就是將數據由屏幕上輸出的意思!
-# :同樣的,也有較佳的壓縮比的意思!
范例一:將剛剛由 bzip2 所遺留下來的 /tmp/services 通過 xz 來壓縮!
[dmtsai@study tmp]$ xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[dmtsai@study tmp]$ ls -l services*
-rw-rw-r--. 1 dmtsai dmtsai 123932 Jun 30 19:09 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
-rw-r--r--. 1 dmtsai dmtsai 99608 Jun 30 18:40 services.xz
# 各位觀眾!看到沒有啊!!容量又進一步下降的更多耶!好棒的壓縮比!
范例二:列出這個壓縮文件的信息,然后讀出這個壓縮文件的內容
[dmtsai@study tmp]$ xz -l services.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
# 竟然可以列出這個文件的壓縮前后的容量,真是太人性化了!這樣觀察就方便多了!
[dmtsai@study tmp]$ xzcat services.xz
范例三:將他解壓縮吧!
[dmtsai@study tmp]$ xz -d services.xz
范例四:保留原文件的文件名,并且創建壓縮文件!
[dmtsai@study tmp]$ xz -k services
```
雖然 xz 這個壓縮比真的好太多太多了!以鳥哥選擇的這個 services 文件為范例,他可以將 gzip 壓縮比 (壓縮后/壓縮前) 的 21% 更進一步優化到 15% 耶! 差非常非常多!不過, xz 最大的問題是...時間花太久了!如果你曾經使用過 xz 的話,應該會有發現,他的運算時間真的比 gzip 久很多喔!
鳥哥以自己的系統,通過“ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] ”去執行運算結果,結果發現這三個指令的執行時間依序是: 0.019s, 0.042s, 0.261s, 看最后一個數字!差了 10 倍的時間耶!所以,如果你并不覺得時間是你的成本考慮,那么使用 xz 會比較好!如果時間是你的重要成本,那么 gzip 恐怕是比較適合的壓縮軟件喔!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀