檔案的壓縮與打包
本文以不再維護,更新文章請參考 此處
最近更新日期:2003/05/02
壓縮的用途與技術
Linux 壓縮檔案的附檔名
 compress
 gzip, zcat
 bzip2, bzcat
 tar
 cpio
本章習題練習

壓縮的用途與技術
您是否有過文件檔案太大,導致無法以一片軟碟將他複製完成的困擾?又,您是否有過,發現一個軟體裡面有好多檔案,這些檔案要將他複製與攜帶都很不方便的問題?還有,您是否有過要備份某些重要資料,偏偏這些資料量太大了,耗掉了你很多的硬碟與磁碟空間呢?這個時候,那個好用的『檔案壓縮』技術可就派的上用場了!因為這些比較大型的檔案透過所謂的檔案壓縮技術之後,可以將他的磁碟使用量降低,可以達到減低檔案容量的效果,此外,有的壓縮程式還可以進行容量限制,使一個大型檔案可以分割成為數個小型檔案,以方便軟碟片攜帶呢!
 
那麼什麼是『檔案壓縮』呢?我們來稍微談一談他的原理好了。目前我們使用的電腦系統中都是使用所謂的 bytes 單位來計量的!不過,事實上,電腦最小的計量單位應該是 bits 才對啊,此外,我們也知道 1 byte = 8 bits 。但是如果今天我們只是記憶一個數字,亦即是 1 這個數字呢?他會如何記錄?假設一個 byte 可以看成底下的模樣:(註:由於 1 byte = 8 bits ,所以每個 byte 當中會有 8 個空格,而每個空格可以是 0, 1 ,這裡僅是做為一個約略的介紹,讀者不必刻意記憶 )
□□□□□□□□
而由於我們記錄數字是 1 ,考慮電腦所謂的二進位喔,如此一來, 1 會在最右邊佔據 1 個 bit ,而其他的 7 個 bits 將會自動的被填上 0 囉!你看看,其實在這樣的例子中,那 7 個 bits 應該是『空的』才對!不過,為了要滿足目前我們的作業系統資料的存取,所以就會將該資料轉為 byte 的型態來記錄了!而一些聰明的電腦工程師就利用一些複雜的計算方式,將這些沒有使用到的空間『丟』出來,以讓檔案佔用的空間變小!這就是壓縮的技術啦!簡單的說,你可以將他想成,其實檔案裡面有相當多的『空間』存在,並不是完全填滿的,而『壓縮』的技術就是將這些『空間』填滿,以讓整個檔案佔用的容量下降!不過,這些『壓縮過的檔案』並無法直接被我們的作業系統所使用的,因此,若要使用這些被壓縮過的檔案資料,則必須將他『還原』回來未壓縮前的模樣,那就是所謂的『解壓縮』囉!而至於壓縮前與壓縮後的檔案所佔用的磁碟空間大小,就可以被稱為是『壓縮比』囉!更多的技術文件或許你可以參考一下 GNU 計畫當中關於壓縮指令 gzip 的說明文件。當然,我 這裡 也保留一份資料,做為未來參考之用呢!
 
這個『壓縮』與『解壓縮』的動作有什麼好處呢?最大的好處就是壓縮過的檔案容量變小了,所以你的硬碟容量無形之中就可以容納更多的資料,此外,在一些網路資料的傳輸中,也會由於資料量的降低,好讓網路頻寬可以用來作更多的工作!而不是老是卡在一些大型的檔案上面呢!目前很多的 WWW 網站也是利用檔案壓縮的技術來進行資料的傳送,好讓網站的可利用率上升喔!( 註:這種技術蠻有趣的!他讓您網站上面『看的到的資料』在經過網路傳輸時,使用的是『壓縮過的資料』,等到這些壓縮過的資料到達你的電腦主機時,再進行解壓縮,由於目前的電腦運算速度相當的快速,因此其實在網頁瀏覽的時候,時間都是花在『資料的傳輸』上面,而不是 CPU 的運算啦!,如此一來,由於壓縮過的資料量降低了,自然傳送的速度就會增快不少! )若您是一位軟體工程師,那麼相信您也會喜歡將你自己的軟體壓縮之後提供大家下載來使用,畢竟沒有人喜歡自己的網站天天都是頻寬滿載的吧?!舉個例子來說, Linux 2.4.19 完整的核心大小約有 200 MB 左右,而由於核心主要多是 ASCII code 的存文字型態檔案,這種檔案的『多餘空間』最多了。而一個提供下載的壓縮過的 2.4.19 核心大約僅有 30MB 左右,差了幾倍呢?您可以自己算一算喔!

Linux 壓縮檔案的附檔名
如果您常常在網路上面捉 Linux 的資料下來玩的話,大概會曉得的是,這些供人下載的檔案通常都是『壓縮』過的!為了什麼?上面已經稍微提過啦!呵呵!壓縮過的檔案具有節省頻寬、節省磁碟空間等等的優點,並且還方便攜帶呢! ^_^ !而,您應該也會知道,這些被壓縮過的檔案,通常其附檔名都是『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 』等等的,為什麼要訂定這些壓縮檔案附檔名為這樣的模樣呢?這是因為在 Linux 上面壓縮的指令相當的多,並且,這些壓縮指令可能無法針對每種壓縮檔案都可以解的開,畢竟目前的壓縮技術五花八門,每種壓縮計算的方法都不是完全相同的,所以囉,當你捉到某個壓縮檔時,自然就需要知道壓縮他的是那個指令啦,好用來對照著解壓縮啊! ^_^!也就是說,雖然 Linux 檔案的屬性基本上是與檔名沒有絕對關係的,能不能執行與他的檔案屬性有關而已,與檔名的關係很小!但是,為了幫助我們小小的人類腦袋瓜子,所以適當的檔案名稱附檔名還是必要的!因此,目前就有一些常常見到的壓縮檔案的附檔名啦!我們僅列出常見的幾樣在底下,給大家權做參考之用: 目前常見的壓縮程式主要就是如同上面提到的附檔名對應的那些指令啦!最早期的要算是 compress 這個傢伙了,而後,後來的 GNU 計畫開發出新一代的壓縮指令 gzip ( GNU zip ) 用來取代 compress 這個老牌的壓縮指令,再來還有 bzip2 這個壓縮比更好的壓縮指令呢!不過,這些指令通常僅能針對一個檔案來壓縮與解壓縮,如此一來,每次壓縮與解壓縮都要一大堆檔案,豈不煩人?,此時,那個所謂的『打包軟體』就顯的很重要啦!在 Unix-Like 當中,有個軟體很好玩,他就是 tar 這支程式!這個 tar 可以將很多檔案『打包』成為一個檔案!甚至是目錄也可以這麼玩。不過,單純的 tar 功能僅是『打包』而已,亦即是將很多檔案集結成為一個檔案,事實上,他並沒有提供壓縮的功能,後來, GNU 計畫中,將整個 tar 與壓縮的功能結合在一起,如此一來提供使用者更方便並且更強大的壓縮與打包功能!
 
底下我們就來談一談這些在 Linux 底下基本的壓縮指令吧!

本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )

2003/02/09:第一次完成
2003/05/05:修改 tar 的部分內容,尤其是 -P 這個參數的配合用法