Linux下檔案的壓縮與打包詳解

pythontab發表於2013-04-27

在Linux中,有很多的壓縮命令。利用這些壓縮命令,可以方便的從網路上下載大型的檔案。同時,我們知道,Linux檔案的副檔名是沒有特殊意義的,不過,因為Linux下存在著許多壓縮命令,所以為了方便記憶,會對這些命令所壓縮的檔案進行一些特殊的命名方式。本篇隨筆將主要記錄一下Linux系統常見的壓縮命令。


一、壓縮檔案的原理


壓縮技術,簡而言之,我們可以將其想象成:其實檔案裡面有很多的"空間"存在,並不是完全填滿的,而"壓縮"技術就是將這些"空間"填滿,從而使得整個檔案佔用量下降。


目前我們的作業系統資料中,都是使用位元組(byte)單位來計量,不過事實上,計算機中最小的計量單位應該是位(bit),我們知道 1 byte = 8 bit。那麼我們是怎麼樣對一些資料進行記錄的呢?


例如我們只是需要記憶一個數字,即1這個數字,考慮到計算機所謂的二進位制,如此一來, 1 會在最右邊佔據 1 個 bit ,而其他的 7 個 bits 將會自動的被填上 0 !其實在這樣的例子中,那 7 個 bits 應該是 【空的】 才對!不過,為了要滿足目前我們的作業系統資料的存取,所以就會將該資料轉為 byte 的型態來記錄。而壓縮技術就是將這些沒有使用到的空間"丟"出來。


檔案壓縮以後可以降低磁碟的使用量,減少檔案的大小。不過這些"壓縮過的檔案"無法直接被作業系統所使用,因此,若要使用這些被壓縮過的檔案資料,則必須將它"還原"成未被壓縮的樣子,這就是"解壓縮"。


二、Linux系統常見的壓縮命令


在Linux的環境中,壓縮檔案的副檔名大多是:【*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2】,為什麼會有這麼多種的副檔名呢?


這是因為 Linux 支援的壓縮命令非常多,且不同的命令所用的壓縮技術並不相同,當然彼此之間可能就無法互相壓縮/解壓縮檔案。 所以,當你下載到某個壓縮檔案時,自然就需要知道該檔案是由哪種壓縮命令所製作出來的,這樣才可以使用對應的壓縮命令對其進行解壓縮。 雖然 Linux 檔案的屬性基本上是與檔名沒有絕對關係的, 但是為了幫助我們進行識別,所以適當的副檔名還是必要。目前Linux系統中一些常用的壓縮檔案的副檔名如下大致有以下幾種:



*.Z         compress 程式壓縮的檔案;  //在當前的Linux主流版本中都已經預設沒有支援該壓縮命令了,因為gzip命令已經取代了compress命令了

*.gz        gzip 程式壓縮的檔案;

*.bz2       bzip2 程式壓縮的檔案;

*.tar       tar 程式打包的資料,並沒有壓縮過;

*.tar.gz    tar 程式打包的檔案,其中並且經過 gzip 的壓縮

*.tar.bz2   tar 程式打包的檔案,其中並且經過 bzip2 的壓縮


接下來我們來看一下Linux系統下常見的一些壓縮命令。


1.gzip、zcat


gzip 可以說是使用最廣的壓縮命令了!目前 gzip 可以解壓 compress, zip 與 gzip 等軟體所壓縮的檔案。 透過gzip命令所建立的壓縮檔案為 *.gz 的檔名。



[root@xiaoluo ~]# gzip [-cdtv#] 檔名

[root@xiaoluo ~]# zcat 檔名.gz

選項與引數:

-c  :將壓縮的資料輸出到螢幕上,可透過過資料流重導向來處理;

-d  :解壓縮的引數;

-t  :可以用來檢驗一個壓縮檔案的一致性,看看檔案有無錯誤;

-v  :可以顯示出原檔案/壓縮檔案的壓縮比等資訊;

-#  :壓縮等級(1~9),-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!預設是 -6  


例項一:將 /etc/passwd 複製到 /home 目錄下,並且以gzip進行壓縮

[root@xiaoluo home]# cp /etc/passwd passwd

[root@xiaoluo home]# ls -l

-rw-r--r--.  1 root    root         2679 4月  26 19:37 passwd

[root@xiaoluo home]# gzip passwd

[root@xiaoluo home]# ls -l

-rw-r--r--.  1 root    root         1066 4月  26 19:37 passwd.gz

# 此時我們會發現我們剛才複製過來的 passwd 這個檔案已經變成了 passwd.gz 這個壓縮檔案了


例項二:將例項一的檔案內容讀出來

[root@xiaoluo home]# zcat passwd.gz

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

....................................此處省略N個字......................................

#此時我們可以看到 passwd.gz 解壓縮之後的檔案內容


例項三:將例項一的檔案進行解壓縮

[root@xiaoluo home]# gzip -d passwd.gz

[root@xiaoluo home]# ls -l

-rw-r--r--.  1 root    root         2679 4月  26 19:37 passwd

#此時我們可以看到,剛才的passwd.gz 檔案又被解壓縮成了passwd這個檔案了


例項四:將例項三解壓縮的passwd檔案用最佳壓縮包進行壓縮,並保留原來的檔案

[root@xiaoluo home]# gzip -c9 passwd > passwd.gz

[root@xiaoluo home]# ls -l passwd*

-rw-r--r--. 1 root root 2679 4月  26 19:37 passwd

-rw-r--r--. 1 root root 1066 4月  26 19:52 passwd.gz


注意:當你使用 gzip 進行壓縮時,在預設的狀態下原本的檔案會被壓縮成為 .gz 的檔名, 原始檔案就不再存在了。所以如果要保留原來的檔案,可以使用例項四的方法來進行壓縮


我們知道,cat命令可以用來讀取一個文字檔案的內容,那麼我們如果要來讀取壓縮檔案資料內容要使用什麼命令呢?就是上面例項的 zcat 命令了。


2.bzip2、bzcat


如果說gzip是為了取代compress命令,那麼bzip2這個命令就是gzip的另一個升級版本



[root@xiaoluo ~]# bzip2 [-cdkzv#] 檔名

[root@xiaoluo ~]# bzcat 檔名.bz2

選項與引數:

-c  :將壓縮的過程產生的資料輸出到螢幕上

-d  :解壓縮的引數

-k  :保留原始檔案,而不會刪除原始的檔案

-z  :壓縮的引數

-v  :可以顯示出原檔案/壓縮檔案的壓縮比等資訊;

-#  :與 gzip 同樣的,都是在計算壓縮比的引數, -9 最佳, -1 最快!


例項一:將剛才的passwd進行壓縮

[root@xiaoluo home]# bzip2 -z passwd

[root@xiaoluo home]# ls -l passwd*

-rw-r--r--. 1 root root 1102 4月  26 19:37 passwd.bz2

# 此時passwd已經變成了passwd.bz2檔案了


例項二:將例項一的檔案進行解壓縮

[root@xiaoluo home]# bzip2 -d passwd.bz2

[root@xiaoluo home]# ls -l passwd*

-rw-r--r--. 1 root root 2679 4月  26 19:37 passwd


例項三:將例項二的檔案進行壓縮,並保留原來的檔案

[root@xiaoluo home]# bzip2 -zk passwd

[root@xiaoluo home]# ls -l passwd*

-rw-r--r--. 1 root root 2679 4月  26 19:37 passwd

-rw-r--r--. 1 root root 1102 4月  26 19:37 passwd.bz2

# -k這個引數就可以保留原檔案  或者使用 bzip2 -c passwd > passwd.bz2 這個命令也可以


使用gzip,副檔名自動為.gz。使用bzip2的話,副檔名就自動變成了.bz2.同樣,如果我們需要讀取bzip2壓縮檔案的資料內容時,使用bzcat命令即可


3.tar


這個命令我們應該見得挺多的,之前在進行解壓縮時,通常都是使用這個命令


上面提到的幾個命令大多僅能針對單一檔案來進行壓縮,雖然 gzip 與 bzip2 也能夠針對目錄來進行壓縮, 不過,這兩個命令對目錄的壓縮指的是【將目錄內的所有檔案 "分別" 進行壓縮】的動作! 而不像在 Windows 的系統,可以使用類似 WinRAR這一類的壓縮軟體來將好多資料【打包成一個檔案】的樣式。


這種將多個檔案或目錄包成一個大檔案的命令功能,我們將其稱為 打包命令! 那麼Linux系統下有沒有這樣的命令呢?當然是有點,tar命令就是我們們需要的打包命令。 tar 可以將多個目錄或檔案打包成一個大檔案,同時還可以透過 gzip/bzip2 的支援,將該檔案同時進行壓縮。



[root@xiaoluo ~]# tar [-j|-z] [cv] [-f 建立的檔名] filename... <==打包與壓縮

[root@xiaoluo ~]# tar [-j|-z] [tv] [-f 建立的檔名]             <==檢視檔名

[root@xiaoluo ~]# tar [-j|-z] [xv] [-f 建立的檔名] [-C 目錄]   <==解壓縮

選項與引數:

-c  :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename)

-t  :檢視tarfile裡的檔案

-x  :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開

     特別留意的是, -c, -t, -x 不可同時出現在一串命令列中。

-j  :透過 bzip2 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2

-z  :透過 gzip  的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.gz

-v  :在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來

-f filename:-f 後面要立刻接要被處理的檔名!建議 -f 單獨寫一個選項

-C 目錄    :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。


-p  :保留備份資料的原本許可權與屬性,常用於備份(-c)重要的配置檔案

-P  :保留絕對路徑,亦即允許備份資料中含有根目錄存在之意;

--exclude=FILE:在壓縮的過程中,不要將 FILE 打包


例項一:將這個/etc目錄下的檔案全部打包成 /home/etc.tar

[root@xiaoluo home]# tar -cvf etc.tar /etc     -->> 這個命令只是用來打包,不進行壓縮


[root@xiaoluo home]# tar -zcvf etc.tar /etc     -->> 打包以後,使用gzip 對其進行壓縮

[root@xiaoluo home]# tar -jcvf etc.tar /etc    -->> 打包以後,使用bzip2 對其進行壓縮

# 特別注意,在引數 f 之後的檔案檔名是自己取的,我們習慣上都用 .tar 來作為標識。

# 如果加 z 引數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file

# 如果加 j 引數,則以 .tar.bz2 來作為副檔名


例項二:檢視上述etc.tar 檔案裡有哪些內容

[root@xiaoluo ~]# tar -ztvf etc.tar

# 由於我們使用 gzip 壓縮,所以要查閱該 tarfile 內的檔案時,

# 就得要加上 z 這個引數


例項三:將etc.tar 檔案解壓縮到當前目錄下

[root@xiaoluo home]# tar -zxvf etc.tar

# 此時我們可以發現當前目錄下已經有了一個etc的資料夾,裡面就是我們解壓縮出來的檔案


例項四:如果我只是希望將 etc.tar 中的 etc/passwd 解壓出來

[root@xiaoluo home]# tar -zxvf etc.tar etc/passwd

# 我可以透過 tar -ztvf 來查閱 tarfile 內的檔名,如果單隻要一個檔案,

# 就可以透過這個方式來完成。注意到! etc.tar.gz 內的根目錄 / 不見了


例項五:備份/etc 內的所有檔案,並且儲存其許可權

[root@xiaoluo home]# tar -zxvpf etc.tar.gz /etc/

# 這個 -p 的屬性是很重要的,尤其是當您要保留原本檔案的屬性時


例項六:在/home 中,比2013/04/01 新的檔案就進行備份

[root@xiaoluo home]# tar -N '2013/04/01' -zcvf home.tar /home


例項七:我要備份/home,/etc的所有檔案,但是不要備份/home/xiaoluo 這個目錄下的檔案

[root@xiaoluo home]# tar --exclude /home/xiaoluo -zcvf myfile.tar.gz /home/* /etc


透過上面的一些例項,可以看到tar這個命令是一個多用途的壓縮命令。我們透過tar命令可以完成備份的功能。由於tar整合過後的檔案我們通常取名為 *.tar,如果在打包過程中還是用了gzip的壓縮屬性,則將檔案取名為*.tar.gz。


相關文章