在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。