Linux系列5:文件的壓縮與打包

0 前言

在Linux的環境中,壓縮文件的擴展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2』,爲什麼會有這樣的擴展名呢?不是說 Linux 的擴展名沒有什麼作用嗎?

這是因爲 Linux 支持的壓縮命令非常多,且不同的命令所用的壓縮技術並不相同,當然彼此之間可能就無法互通壓縮/解壓縮文件羅。 所以,當你下載到某個壓縮檔時,自然就需要知道該文件是由哪種壓縮命令所製作出來的,好用來對照著解壓縮啊! 也就是說,雖然 Linux 文件的屬性基本上是與檔名沒有絕對關係的, 但是爲了幫助我們人類小小的腦袋瓜子,所以適當的擴展名還是必要的! 底下我們就列出幾個常見的壓縮文件擴展名吧:

*.Z         compress 程序壓縮的文件;
*.gz        gzip 程序壓縮的文件;
*.bz2       bzip2 程序壓縮的文件;
*.tar       tar 程序打包的數據,並沒有壓縮過;
*.tar.gz    tar 程序打包的文件,其中並且經過 gzip 的壓縮
*.tar.bz2   tar 程序打包的文件,其中並且經過 bzip2 的壓縮

Linux上常見的壓縮命令就是 gzip 與 bzip2 ,至於 compress 已經退流行了。 gzip 是由 GNU 計畫所開發出來的壓縮命令,該命令已經取代了 compress 。 後來 GNU 又開發出 bzip2 這個壓縮比更好的壓縮命令!不過,這些命令通常僅能針對一個文件來壓縮與解壓縮,如此一來, 每次壓縮與解壓縮都要一大堆文件,豈不煩人?此時,那個所謂的『打包軟件, tar』就顯的很重要啦!

這個 tar 可以將很多文件『打包』成爲一個文件!甚至是目錄也可以這麼玩。不過,單純的 tar 功能僅是『打包』而已,亦即是將很多文件集結成爲一個文件, 事實上,他並沒有提供壓縮的功能,後來,GNU 計畫中,將整個 tar 與壓縮的功能結合在一起,如此一來提供使用者更方便並且更強大的壓縮與打包功能! 底下我們就來談一談這些在 Linux 底下基本的壓縮命令吧!

1 常見的壓縮命令

1.1 compress

compress這個壓縮命令是非常老舊的一款,大概只有在非常舊的 Unix 機器上面還會找到這個軟件。 我們的 CentOS 默認並沒有安裝這個軟件到系統當中,所以想要了解這個軟件的使用時,請先安裝 ncompress 這個軟件。 不過,由於 gzip 已經可以解開使用 compress 壓縮的文件,因此, compress 可以不用學習啦! 但是,如果你所在的環境還是有老舊的系統,那麼還是得要學一學就是了。好了, 如果你有網絡的話,那麼安裝其實很簡單喔!


[root@www ~]# yum install ncompress
base        100% |=========================| 1.1 kB    00:00
updates     100% |=========================|  951 B    00:00
addons      100% |=========================|  951 B    00:00
extras      100% |=========================| 1.1 kB    00:00
Setting up Install Process
Parsing package install arguments
Resolving Dependencies              <==開始分析相依性
--> Running transaction check
---> Package ncompress.i386 0:4.2.4-47 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================
 Package       Arch   Version     Repository     Size
=======================================================
Installing:
 ncompress     i386   4.2.4-47    base            23 k

Transaction Summary
=======================================================
Install      1 Package(s)  <==最後分析所要安裝的軟件數
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 23 k
Is this ok [y/N]: y    <==這裏請按下 y 來確認安裝
Downloading Packages:
(1/1): ncompress-4.2.4-47 100% |=========================|  23 kB    00:00
warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e8562897
Importing GPG key 0xE8562897 "CentOS-5 Key (CentOS 5 Official Signing Key) 
<[email protected]>" from http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
Is this ok [y/N]: y    <==這裏則是與數碼簽章有關
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: ncompress          ######################### [1/1]

Installed: ncompress.i386 0:4.2.4-47
Complete!

關於 yum 更詳細的用法我們會在後續的章節介紹,這裏僅是提供一個大概的用法而已。 等你安裝好這個軟件後,接下來讓我們看看如何使用 compress 吧!

[root@www ~]# compress [-rcv] 文件或目錄  <==這裏是壓縮
[root@www ~]# uncompress 文件.Z           <==這裏是解壓縮
選項與參數:
-r  :可以連同目錄下的文件也同時給予壓縮呢!
-c  :將壓縮數據輸出成爲 standard output (輸出到螢幕)
-v  :可以秀出壓縮後的文件資訊以及壓縮過程中的一些檔名變化。

範例一:將 /etc/man.config 複製到 /tmp ,並加以壓縮
[root@www ~]# cd /tmp
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# compress -v man.config
man.config:  -- replaced with man.config.Z Compression: 41.86%
[root@www tmp]# ls -l /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config   <==原有文件
-rw-r--r-- 1 root root 2684 Nov 10 17:14 /tmp/man.config.Z <==經過壓縮的文件!

不知道你有沒有發現,複製到 /tmp 的 man.config 不見了!因爲被壓縮成爲 man.config.Z 羅 也就是說, 在默認的情況中,被 compress 壓縮的原始文件會不見,而壓縮文件會被創建起來, 而且擴展名會是 *.Z。 仔細看一下,文件由原本的 4617bytes 降低到 2684bytes左右,確實有減少一點啦! 那麼如何解壓縮呢?

範例二:將剛剛的壓縮檔解開
[root@www tmp]# uncompress man.config.Z
[root@www tmp]# ll man*
-rw-r--r-- 1 root root 4617 Nov 10 17:14 man.config

解壓縮直接用 uncompress 即可!解壓縮完畢後該文件就自動的變回來了!不過,那個壓縮檔卻又不存在羅~ 這樣可以理解用法了嗎?那如果我想要保留原始文件且又要創建壓縮檔呢?可以使用 -c 的語法!

範例三:將 man.config 壓縮成另外一個文件來備份
[root@www tmp]# compress -c man.config > man.config.back.Z
[root@www tmp]# ll man*
-rw-r--r-- 1 root root 4617 Nov 10 17:14 man.config
-rw-r--r-- 1 root root 2684 Nov 10 17:24 man.config.back.Z
# 這個 -c 的選項比較有趣!他會將壓縮過程的數據輸出到螢幕上,而不是寫入成爲 
# *.Z 的壓縮檔。所以,我們可以透過數據流重導向的方法將數據輸出成爲另一個檔名。
# 關於數據流重導向,我們會在第十一章 bash 詳細談論的啦!

**再次強調,compress 已經很少人在使用了,因爲這支程序無法解開 .gz 的文件,而 gzip 則可以解開 .Z 的文件。

1.2 gzip, zcat

gzip 可以說是應用度最廣的壓縮命令了!目前 gzip 可以解開 compress, zip 與 gzip 等軟件所壓縮的文件。 至於 gzip 所創建的壓縮檔爲 *.gz 的檔名喔!讓我們來看看這個命令的語法吧:

[root@www ~]# gzip [-cdtv#] 檔名
[root@www ~]# zcat 檔名.gz
選項與參數:
-c  :將壓縮的數據輸出到螢幕上,可透過數據流重導向來處理;
-d  :解壓縮的參數;
-t  :可以用來檢驗一個壓縮檔的一致性~看看文件有無錯誤;
-v  :可以顯示出原文件/壓縮文件的壓縮比等資訊;
-#  :壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!默認是 -6

範例一:將 /etc/man.config 複製到 /tmp ,並且以 gzip 壓縮
[root@www ~]# cd /tmp 
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# gzip -v man.config
man.config:      56.1% -- replaced with man.config.gz
[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
-rw-r--r-- 1 root root 2684 Nov 10 17:24 /tmp/man.config.back.Z
-rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz  <==gzip壓縮比較佳

與 compress 類似的,當你使用 gzip 進行壓縮時,在默認的狀態下原本的文件會被壓縮成爲 .gz 的檔名, 原始文件就不再存在了。您也可以發現,由於 gzip 的壓縮比要比 compress 好的多,所以當然建議使用 gzip 啦! 此外,使用 gzip 壓縮的文件在 Windows 系統中,竟然可以被 WinRAR 這個軟件解壓縮呢!很好用吧!至於其他的用法如下:

範例二:由於 man.config 是文字檔,請將範例一的壓縮檔的內容讀出來!
[root@www tmp]# zcat man.config.gz
# 由於 man.config 這個原本的文件是是文字檔,因此我們可以嘗試使用 zcat  去讀取!
# 此時螢幕上會顯示 man.config.gz 解壓縮之後的文件內容!

範例三:將範例一的文件解壓縮
[root@www tmp]# gzip -d man.config.gz
# 不要使用 gunzip 這個命令,不好背!使用 gzip -d 來進行解壓縮!
# 與 gzip 相反, gzip -d 會將原本的 .gz 刪除,產生原本的 man.config 文件。

範例四:將範例三解開的 man.config 用最佳的壓縮比壓縮,並保留原本的文件
[root@www tmp]# gzip -9 -c man.config > man.config.gz

其實 gzip 的壓縮已經最佳化過了,所以雖然 gzip 提供 1~9 的壓縮等級,不過使用默認的 6 就非常好用了! 因此上述的範例四可以不要加入那個 -9 的選項。範例四的重點在那個 -c 與 > 的使用羅!

cat 可以讀取純文字檔,那個 zcat 則可以讀取純文字檔被壓縮後的壓縮檔! 由於 gzip 這個壓縮命令主要想要用來取代 compress 的,所以不但 compress 的壓縮文件可以使用 gzip 來解開,同時 zcat 這個命令可以同時讀取 compress 與 gzip 的壓縮檔呦!

1.3 bzip2, bzcat

若說 gzip 是爲了取代 compress 並提供更好的壓縮比而成立的,那麼 bzip2 則是爲了取代 gzip 並提供更佳的壓縮比而來的。 bzip2 真是很不錯用的東西~這玩意的壓縮比竟然比 gzip 還要好~至於 bzip2 的用法幾乎與 gzip 相同! 看看底下的用法吧!

[root@www ~]# bzip2 [-cdkzv#] 檔名
[root@www ~]# bzcat 檔名.bz2
選項與參數:
-c  :將壓縮的過程產生的數據輸出到螢幕上!
-d  :解壓縮的參數
-k  :保留原始文件,而不會刪除原始的文件喔!
-z  :壓縮的參數
-v  :可以顯示出原文件/壓縮文件的壓縮比等資訊;
-#  :與 gzip 同樣的,都是在計算壓縮比的參數, -9 最佳, -1 最快!

範例一:將剛剛的 /tmp/man.config 以 bzip2 壓縮
[root@www tmp]# bzip2 -z man.config 
# 此時 man.config 會變成 man.config.bz2 !

範例二:將範例一的文件內容讀出來!
[root@www tmp]# bzcat man.config.bz2
# 此時螢幕上會顯示 man.config.bz2 解壓縮之後的文件內容!!

範例三:將範例一的文件解壓縮
[root@www tmp]# bzip2 -d man.config.bz2

範例四:將範例三解開的 man.config 用最佳的壓縮比壓縮,並保留原本的文件
[root@www tmp]# bzip2 -9 -c man.config > man.config.bz2

使用 compress 擴展名自動創建爲 .Z ,使用 gzip 擴展名自動創建爲 .gz 。這裏的 bzip2 則是自動的將擴展名建置爲 .bz2 羅!所以當我們使用具有壓縮功能的 bzip2 -z 時,那麼剛剛的 man.config 就會自動的變成了 man.config.bz2 這個檔名羅!

好了,那麼如果我想要讀取這個文件的內容呢? 是否一定要解開?當然不需要羅!可以使用簡便的 bzcat 這個命令來讀取內容即可!例如上面的例子中, 我們可以使用 bzcat man.config.bz2 來讀取數據而不需要解開!此外,當你要解開一個壓縮檔時, 這個文件的名稱爲 .bz, .bz2, .tbz, .tbz2 等等,那麼就可以嘗試使用 bzip2 來解看看啦!當然羅,也可以使用 bunzip2 這個命令來取代 bzip2 -d 羅。

2 打包命令:tar

2.1 tar命令介紹

tar 的選項與參數非常的多!我們只講幾個常用的選項,更多選項您可以自行 man tar 查詢羅!

[root@www ~]# tar [-j|-z] [cv] [-f 創建的檔名] filename... <==打包與壓縮
[root@www ~]# tar [-j|-z] [tv] [-f 創建的檔名]             <==察看檔名
[root@www ~]# tar [-j|-z] [xv] [-f 創建的檔名] [-C 目錄]   <==解壓縮
選項與參數:
-c  :創建打包文件,可搭配 -v 來察看過程中被打包的檔名(filename)
-t  :察看打包文件的內容含有哪些檔名,重點在察看『檔名』就是了;
-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 打包! 

其實最簡單的使用 tar 就只要記憶底下的方式即可:

  • 壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的文件或目錄名稱
  • 查 詢:tar -jtv -f filename.tar.bz2
  • 解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄

那個 filename.tar.bz2 是我們自己取的檔名,tar 並不會主動的產生創建的檔名喔!我們要自訂啦! 所以擴展名就顯的很重要了!如果不加 [-j|-z] 的話,檔名最好取爲 *.tar 即可。如果是 -j 選項,代表有 bzip2 的支持,因此檔名最好就取爲 *.tar.bz2 ,因爲 bzip2 會產生 .bz2 的擴展名之故! 至於如果是加上了 -z 的 gzip 的支持,那檔名最好取爲 *.tar.gz 喔!瞭解乎?

另外,由於『 -f filename 』是緊接在一起的,過去很多文章常會寫成『-jcvf filename』,這樣是對的, 但由於選項的順序理論上是可以變換的,所以很多讀者會誤認爲『-jvfc filename』也可以~事實上這樣會導致產生的檔名變成 c ! 因爲 -fc 嘛!所以羅,建議您在學習 tar 時,將『 -f filename 』與其他選項獨立出來,會比較不容易發生問題。

閒話少說,讓我們來測試幾個常用的 tar 方法吧!

2.2 使用 tar 加入 -j 或 -z 的參數備份目錄

有事沒事備份一下 /etc 這個目錄是件好事!備份 /etc 最簡單的方法就是使用 tar 羅!讓我們來玩玩先:

[root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names  <==注意這個警告信息
/etc/
....中間省略....
/etc/esd.conf
/etc/crontab
# 由於加上 -v 這個選項,因此正在作用中的檔名就會顯示在螢幕上。
# 如果你可以翻到第一頁,會發現出現上面的錯誤信息!底下會講解。
# 至於 -p 的選項,重點在於『保留原本文件的權限與屬性』之意。

[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 顯示的信息會跟上面一模一樣羅!

[root@www ~]# ll /root/etc*
-rw-r--r-- 1 root root  8740252 Nov 15 23:07 /root/etc.tar.bz2
-rw-r--r-- 1 root root 13010999 Nov 15 23:01 /root/etc.tar.gz
[root@www ~]# du -sm /etc
118     /etc
# 爲什麼建議您使用 -j 這個選項?從上面的數值你可以知道了吧?^_^

由上述的練習,我們知道使用 bzip2 亦即 -j 這個選項來製作備份時,能夠得到比較好的壓縮比! 如上表所示,由原本的 /etc/ (118MBytes) 下降到 8.7Mbytes 左右!至於加上『 -p 』這個選項的原因是爲了保存原本文件的權限與屬性!我們曾在第七章的 cp 命令介紹時談到權限與文件類型(例如連結檔)對複製的不同影響。 同樣的,在備份重要的系統數據時,這些原本文件的權限需要做完整的備份比較好。此時 -p 這個選項就派的上用場了。 接下來讓我們看看打包文件內有什麼數據存在?

2.3 查閱 tar 文件的數據內容(可察看檔名),與備份文檔名是否有根目錄的意義

要察看檔名非常的簡單!可以這樣做:


[root@www ~]# tar -jtv -f /root/etc.tar.bz2
....前面省略....
-rw-r--r-- root/root  1016 2008-05-25 14:06:20 etc/dbus-1/session.conf
-rw-r--r-- root/root   153 2007-01-07 19:20:54 etc/esd.conf
-rw-r--r-- root/root   255 2007-01-06 21:13:33 etc/crontab

如果加上 -v 這個選項時,詳細的文件權限/屬性都會被列出來!如果只是想要知道檔名而已, 那麼就將 -v 拿掉即可。從上面的數據我們可以發現一件很有趣的事情,那就是每個檔名都沒了根目錄了!這也是上一個練習中出現的那個警告信息『tar: Removing leading /' from member names(移除了檔名開頭的/’ )』所告知的情況!

那爲什麼要拿掉根目錄呢?主要是爲了安全!我們使用 tar 備份的數據可能會需要解壓縮回來使用, 在 tar 所記錄的檔名 (就是我們剛剛使用 tar -jtvf 所察看到的檔名) 那就是解壓縮後的實際檔名。 如果拿掉了根目錄,假設你將備份數據在 /tmp 解開,那麼解壓縮的檔名就會變成『/tmp/etc/xxx』。 但『如果沒有拿掉根目錄,解壓縮後的檔名就會是絕對路徑, 亦即解壓縮後的數據一定會被放置到 /etc/xxx 去!』如此一來,你的原本的 /etc/ 底下的數據, 就會被備份數據所覆蓋過去了!

Tips: 你會說:『既然是備份數據,那麼還原回來也沒有什麼問題吧?』想像一個狀況,你備份的數據是一年前的舊版 CentOS 4.x, 你只是想要了解一下過去的備份內容究竟有哪些數據而已,結果一解開該文件,卻發現你目前新版的 CentOS 5.x 底下的 /etc 被舊版的備份數據覆蓋了!此時你該如何是好?所以羅,當然是拿掉根目錄比較安全一些的。

如果你確定你就是需要備份根目錄到 tar 的文件中,那可以使用 -P (大寫) 這個選項,請看底下的例子分析:

範例:將檔名中的()目錄也備份下來,並察看一下備份檔的內容檔名
[root@www ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
....中間過程省略....
[root@www ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/dbus-1/session.conf
/etc/esd.conf
/etc/crontab
# 這次查閱檔名不含 -v 選項,所以僅有檔名而已!沒有詳細屬性/權限等參數。

有發現不同點了吧?如果加上 -P 選項,那麼檔名內的根目錄就會存在喔!不過,鳥哥個人建議,還是不要加上 -P 這個選項來備份! 畢竟很多時候,我們備份是爲了要未來追蹤問題用的,倒不一定需要還原回原本的系統中! 所以拿掉根目錄後,備份數據的應用會比較有彈性!也比較安全呢!

2.4 將備份的數據解壓縮,並考慮特定目錄的解壓縮動作 (-C 選項的應用)

那如果想要解打包呢?很簡單的動作就是直接進行解打包嘛!

[root@www ~]# tar -jxv -f /root/etc.tar.bz2
[root@www ~]# ll
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(後面省略)....

此時該打包文件會在『本目錄下進行解壓縮』的動作! 所以,你等一下就會在家目錄底下發現一個名爲 etc 的目錄羅!所以羅,如果你想要將該文件在 /tmp 底下解開, 可以 cd /tmp 後,再下達上述的命令即可。不過,這樣好像很麻煩呢~有沒有更簡單的方法可以『指定欲解開的目錄』呢? 有的,可以使用 -C 這個選項喔!舉例來說:

[root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@www ~]# ll /tmp
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(後面省略)....

這樣一來,你就能夠將該文件在不同的目錄解開羅!鳥哥個人是認爲,這個 -C 的選項務必要記憶一下的! 好了,處理完畢後,請記得將這兩個目錄刪除一下呢!


[root@www ~]# rm -rf /root/etc /tmp/etc

再次強調,這個『 rm -rf 』是很危險的命令!下達時請務必要確認一下後面接的檔名。我們要刪除的是 /root/etc 與 /tmp/etc, 您可不要將 /etc/ 刪除掉了!系統會死掉的~ _

2.5 僅解開單一文件的方法

剛剛上頭我們解壓縮都是將整個打包文件的內容全部解開!想像一個情況,如果我只想要解開打包文件內的其中一個文件而已, 那該如何做呢?很簡單的,你只要使用 -jtv 找到你要的檔名,然後將該檔名解開即可。 我們用底下的例子來說明一下:

# 1. 先找到我們要的檔名,假設解開 shadow 文件好了:
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
-r-------- root/root  1230 2008-09-29 02:21:20 etc/shadow-
-r-------- root/root   622 2008-09-29 02:21:20 etc/gshadow-
-r-------- root/root   636 2008-09-29 02:21:25 etc/gshadow
-r-------- root/root  1257 2008-09-29 02:21:25 etc/shadow  <==這是我們要的!
# 先搜尋重要的檔名!其中那個 grep 是『擷取』關鍵字的功能!我們會在第三篇說明!
# 這裏您先有個概念即可!那個管線 | 配合 grep 可以擷取關鍵字的意思!

# 2. 將該文件解開!語法與實際作法如下:
[root@www ~]# tar -jxv -f 打包檔.tar.bz2 待解開檔名
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@www ~]# ll etc
total 8
-r-------- 1 root root 1257 Sep 29 02:21 shadow  <==呦喝!只有一個文件啦!
# 很有趣!此時只會解開一個文件而已!不過,重點是那個檔名!你要找到正確的檔名。
# 在本例中,你不能寫成 /etc/shadow !因爲記錄在 etc.tar.bz2 內的檔名之故!

2.6 打包某目錄,但不含該目錄下的某些文件之作法

假設我們想要打包 /etc/ /root 這幾個重要的目錄,但卻不想要打包 /root/etc* 開頭的文件, 因爲該文件都是剛剛我們才創建的備份檔嘛!而且假設這個新的打包文件要放置成爲 /root/system.tar.bz2 , 當然這個文件自己不要打包自己 (因爲這個文件放置在 /root 底下啊!),此時我們可以透過 --exclude 的幫忙! 那個 exclude 就是不包含的意思!所以你可以這樣做:

[root@www ~]# tar -jcv  -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2  /etc /root

面的命令是一整列的~其實你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要兩行輸入時,最後面加上反斜線 () 並立刻按下 [enter] , 就能夠到第二行繼續輸入了。這個命令下達的方式我們會在第三章再仔細說明。 透過這個 --exclude=“file” 的動作,我們可以將幾個特殊的文件或目錄移除在打包之列, 讓打包的動作變的更簡便喔!_

另外,在新版的 tar 命令中,鳥哥發現原本的『 --exclude file 』似乎無法實際運行了!使用 man tar 明明有看到這個選項的說, 但使用 info tar 才發現,選項功能已經變成了『 --exclude=file 』的模式!這個地方得要特別留意呢!

2.7 僅備份比某個時刻還要新的文件

某些情況下你會想要備份新的文件而已,並不想要備份舊文件!此時 --newer-mtime 這個選項就粉重要啦! 其實有兩個選項啦,一個是『 --newer 』另一個就是『 --newer-mtime 』,這兩個選項有何不同呢? 我們在 第七章的 touch 介紹中談到過三種不同的時間參數, 當使用 --newer 時,表示後續的日期包含『 mtime 與 ctime 』,而 --newer-mtime 則僅是 mtime 而已! 這樣知道了吧! _ 。那就讓我們來嘗試處理一下羅!


# 1. 先由 find 找出比 /etc/passwd 還要新的文件
[root@www ~]# find /etc -newer /etc/passwd
....(過程省略)....
# 此時會顯示出比 /etc/passwd 這個文件的 mtime 還要新的檔名,
# 這個結果在每部主機都不相同!您先自行查閱自己的主機即可,不會跟鳥哥一樣!

[root@www ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd

# 2. 好了,那麼使用 tar 來進行打包吧!日期爲上面看到的 2008/09/29
[root@www ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
> --newer-mtime="2008/09/29" /etc/*
....(中間省略)....
/etc/smartd.conf    <==真的有備份的文件
....(中間省略)....
/etc/yum.repos.d/   <==目錄都會被記錄下來!
tar: /etc/yum.repos.d/CentOS-Base.repo: file is unchanged; not dumped
# 最後行顯示的是『沒有被備份的』,亦即 not dumped 的意思!

# 3. 顯示出文件即可
[root@www ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | \
> grep -v '/$' 
# 透過這個命令可以呼叫出 tar.bz2 內的結尾非 / 的檔名!就是我們要的啦!

現在你知道這個命令的好用了吧!甚至可以進行差異文件的記錄與備份呢~ 這樣子的備份就會顯的更容易羅!你可以這樣想像,如果我在一個月前才進行過一次完整的數據備份, 那麼這個月想要備份時,當然可以僅備份上個月進行備份的那個時間點之後的升級的文件即可! 爲什麼呢?因爲原本的文件已經有備份了嘛!幹嘛還要進行一次?只要備份新數據即可。這樣可以降低備份的容量啊!

3 完整備份工具:dump,restore

某些時刻你想要針對文件系統進行備份或者是儲存的功能時,不能不談到這個 dump 命令! 其實這個命令除了能夠針對整個 filesystem 備份之外,也能夠僅針對目錄來備份喔! 底下就讓我們來談一談這個命令的用法吧!

3.1 dump

其實 dump 的功能頗強,他除了可以備份整個文件系統之外,還可以制定等級喔!什麼意思啊! 假設你的 /home 是獨立的一個文件系統,那你第一次進行過 dump 後,再進行第二次 dump 時, 你可以指定不同的備份等級,假如指定等級爲 1 時,此時新備份的數據只會記錄與第一次備份所有差異的文件而已。 看不懂嗎?沒關係!我們用一張簡圖來說明。
在這裏插入圖片描述
如上圖所示,上方的『即時文件系統』是一直隨著時間而變化的數據,例如在 /home 裏面的文件數據會一直變化一樣。 而底下的方塊則是 dump 備份起來的數據,第一次備份時使用的是 level 0 ,這個等級也是完整的備份啦! 等到第二次備份時,即時文件系統內的數據已經與 level 0 不一樣了,而 level 1 僅只是比較目前的文件系統與 level 0 之間的差異後,備份有變化過的文件而已。至於 level 2 則是與 level 1 進行比較啦!
雖然 dump 支持整個文件系統或者是單一各別目錄,但是對於目錄的支持是比較不足的,這也是 dump 的限制所在。 簡單的說,如果想要備份的數據如下時,則有不同的限制情況:

  • 當待備份的數據爲單一文件系統:
    如果是單一文件系統 (filesystem) ,那麼該文件系統可以使用完整的 dump 功能,包括利用 0~9 的數個 level 來備份, 同時,備份時可以使用掛載點或者是裝置檔名 (例如 /dev/sda5 之類的裝置檔名) 來進行備份!

  • 待備份的數據只是目錄,並非單一文件系統:
    例如你僅想要備份 /home/someone/ ,但是該目錄並非獨立的文件系統時。此時備份就有限制啦!包括:

    • 所有的備份數據都必須要在該目錄 (本例爲:/home/someone/) 底下;
    • 且僅能使用 level 0 ,亦即僅支持完整備份而已;
    • 不支持 -u 選項,亦即無法創建 /etc/dumpdates 這個各別 level 備份的時間記錄檔;

dump 的選項雖然非常的繁複,不過如果只是想要簡單的操作時,您只要記得底下的幾個選項就很夠用了!

[root@www ~]# dump [-Suvj] [-level] [-f 備份檔] 待備份數據
[root@www ~]# dump -W
選項與參數:
-S    :僅列出後面的待備份數據需要多少磁碟空間才能夠備份完畢;
-u    :將這次 dump 的時間記錄到 /etc/dumpdates 文件中;
-v    :將 dump 的文件過程顯示出來;
-j    :加入 bzip2 的支持!將數據進行壓縮,默認 bzip2 壓縮等級爲 2
-level:就是我們談到的等級,從 -0 ~ -9 共十個等級;
-f    :有點類似 tar 啦!後面接產生的文件,亦可接例如 /dev/st0 裝置檔名等
-W    :列出在 /etc/fstab 裏面的具有 dump 配置的 partition 是否有備份過?

3.1.1 用 dump 備份完整的文件系統

現在就讓我們來做幾個範例吧!假如你要將系統的最小的文件系統捉出來進行備份,那該如何進行呢?

# 1. 先找出系統中最小的那個文件系統,如下所示:
[root@www ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hdc2             9.5G  3.7G  5.3G  42% /
/dev/hdc3             4.8G  651M  3.9G  15% /home
/dev/hdc1              99M   11M   83M  12% /boot  <==看起來最小的就是他啦!
tmpfs                 363M     0  363M   0% /dev/shm

# 2. 先測試一下,如果要備份此文件系統,需多少容量?
[root@www ~]# dump -S /dev/hdc1
5630976     <==注意一下,這個單位是 bytes ,所以差不多是 5.6MBytes。

# 3. 將完整備份的檔名記錄成爲 /root/boot.dump ,同時升級記錄檔:
[root@www ~]# dump -0u -f /root/boot.dump /boot
  DUMP: Date of this level 0 dump: Tue Dec  2 02:53:45 2008 <==記錄等級與備份時間
  DUMP: Dumping /dev/hdc1 (/boot) to /root/boot.dump        <==dump的來源與目標
  DUMP: Label: /boot                                        <==文件系統的 label
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]                    <==開始進行文件對應
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 5499 blocks.                              <==評估整體block數量
  DUMP: Volume 1 started with block 1 at: Tue Dec  2 02:53:46 2008
  DUMP: dumping (Pass III) [directories]                    <==開始 dump 工作
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing /root/boot.dump                             <==結束寫入備份檔
  DUMP: Volume 1 completed at: Tue Dec  2 02:53:47 2008
  DUMP: Volume 1 5550 blocks (5.42MB)                       <==最終備份數據容量
  DUMP: Volume 1 took 0:00:01
  DUMP: Volume 1 transfer rate: 5550 kB/s
  DUMP: 5550 blocks (5.42MB) on 1 volume(s)
  DUMP: finished in 1 seconds, throughput 5550 kBytes/sec
  DUMP: Date of this level 0 dump: Tue Dec  2 02:53:45 2008
  DUMP: Date this dump completed:  Tue Dec  2 02:53:47 2008
  DUMP: Average transfer rate: 5550 kB/s
  DUMP: DUMP IS DONE
# 在命令的下達方面,dump 後面接 /boot 或 /dev/hdc1 都可以的!
# 而運行 dump 的過程中會出現如上的一些信息,您可以自行仔細的觀察!

[root@www ~]# ll /root/boot.dump /etc/dumpdates
-rw-rw-r-- 1 root disk      43 Dec  2 02:53 /etc/dumpdates
-rw-r--r-- 1 root root 5683200 Dec  2 02:53 /root/boot.dump
# 由於加上 -u 的選項,因此 /etc/dumpdates 該文件的內容會被升級!注意,
# 這個文件僅有在 dump 完整的文件系統時纔有支持主動升級的功能。

# 4. 觀察一下系統主動創建的記錄檔:
[root@www ~]# cat /etc/dumpdates
/dev/hdc1     0   Tue Dec  2 02:53:47 2008 +0800
[文件系統] [等級] [       ctime 的時間         ]

這樣很簡單的就創建起來 /root/boot.dump 文件,該文件將整個 /boot/ 文件系統都備份下來了! 並且將備份的時間寫入 /etc/dumpdates 文件中,準備讓下次備份時可以作爲一個參考依據。 現在讓我們來進行一個測試,檢查看看能否真的創建 level 1 的備份呢?

# 0. 看一下有沒有任何文件系統被 dump 過的數據?
[root@www ~]# dump -W
Last dump(s) done (Dump '>' file systems):
> /dev/hdc2     (     /) Last dump: never
> /dev/hdc3     ( /home) Last dump: never
  /dev/hdc1     ( /boot) Last dump: Level 0, Date Tue Dec  2 02:53:47 2008
# 如上列的結果,該結果會捉出 /etc/fstab 裏面第五欄位配置有需要 dump 的 
# partition,然後與 /etc/dumpdates 進行比對,可以得到上面的結果啦!
# 尤其是第三行,可以顯示我們曾經對 /dev/hdc1 進行過 dump 的備份動作喔!

# 1. 先惡搞一下,創建一個大約 10 MB 的文件在 /boot 內:
[root@www ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.166128 seconds, 63.1 MB/s

# 2. 開始創建差異備份檔,此時我們使用 level 1 吧:
[root@www ~]# dump -1u -f /root/boot.dump.1 /boot
....(中間省略)....

[root@www ~]# ll /root/boot*
-rw-r--r-- 1 root root  5683200 Dec  2 02:53 /root/boot.dump
-rw-r--r-- 1 root root 10547200 Dec  2 02:56 /root/boot.dump.1
# 看看文件大小,豈不是就是剛剛我們所創建的那個大文件的容量嗎? ^_^

# 3. 最後再看一下是否有記錄 level 1 備份的時間點呢?
[root@www ~]# dump -W
Last dump(s) done (Dump '>' file systems):
> /dev/hdc2     (     /) Last dump: never
> /dev/hdc3     ( /home) Last dump: never
> /dev/hdc1     ( /boot) Last dump: Level 1, Date Tue Dec  2 02:56:33 2008
....(中間省略)....

透過這個簡單的方式,我們就能夠僅備份差異文件的部分羅!底下再來看看針對單一目錄的 dump 用途!

3.1.2 用 dump 備份非文件系統,亦即單一目錄的方法

現在讓我們來處理一下 /etc 的 dump 備份吧!因爲 /etc 並非單一文件系統,他只是個目錄而已。 所以依據限制的說明, -u, level 1~9 都是不適用的。我們只能夠使用 level 0 的完整備份將 /etc 給他 dump 下來。因此作法就變的很簡單了!

# 讓我們將 /etc 整個目錄透過 dump 進行備份,且含壓縮功能
[root@www ~]# dump -0j -f /root/etc.dump.bz2 /etc
  DUMP: Date of this level 0 dump: Tue Dec  2 12:08:22 2008
  DUMP: Dumping /dev/hdc2 (/ (dir etc)) to /root/etc.dump.bz2
  DUMP: Label: /1
  DUMP: Writing 10 Kilobyte records
  DUMP: Compressing output at compression level 2 (bzlib)
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 115343 blocks.
  DUMP: Volume 1 started with block 1 at: Tue Dec  2 12:08:23 2008
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing /root/etc.dump.bz2
  DUMP: Volume 1 completed at: Tue Dec  2 12:09:49 2008
  DUMP: Volume 1 took 0:01:26
  DUMP: Volume 1 transfer rate: 218 kB/s
  DUMP: Volume 1 124680kB uncompressed, 18752kB compressed, 6.649:1
  DUMP: 124680 blocks (121.76MB) on 1 volume(s)
  DUMP: finished in 86 seconds, throughput 1449 kBytes/sec
  DUMP: Date of this level 0 dump: Tue Dec  2 12:08:22 2008
  DUMP: Date this dump completed:  Tue Dec  2 12:09:49 2008
  DUMP: Average transfer rate: 218 kB/s
  DUMP: Wrote 124680kB uncompressed, 18752kB compressed, 6.649:1
  DUMP: DUMP IS DONE
# 上面特殊字體的部分顯示:原本有 124680kb  的容量,被壓縮成爲 18752kb,
# 整個壓縮比爲 6.649:1 ,還可以的壓縮情況啦!

一般來說 dump 不會使用包含壓縮的功能,不過如果你想要將備份的空間降低的話,那個 -j 的選項是可以使用的。 加上 -j 之後你的 dump 成果會使用較少的硬盤容量啦!如上述的情況來看,文件容量由原本的 128MB 左右下滑到 18MB 左右,當然可以節省備份空間羅!

3.2 restore

備份檔就是在急用時可以回覆系統的重要數據,所以有備份當然就得要學學如何復原了! dump 的復原使用的是 restore 這個命令!這個命令的選項也非常的多~您可以自行 man restore 瞧瞧! 鳥哥在這裏僅作個簡單的介紹羅!

[root@www ~]# restore -t [-f dumpfile] [-h]        <==用來察看 dump 檔
[root@www ~]# restore -C [-f dumpfile] [-D 掛載點] <==比較dump與實際文件
[root@www ~]# restore -i [-f dumpfile]             <==進入互動模式
[root@www ~]# restore -r [-f dumpfile]             <==還原整個文件系統
選項與參數:
相關的各種模式,各種模式無法混用喔!例如不可以寫 -tC 啦!
-t  :此模式用在察看 dump 起來的備份檔中含有什麼重要數據!類似 tar -t 功能;
-C  :此模式可以將 dump 內的數據拿出來跟實際的文件系統做比較,
      最終會列出『在 dump 文件內有記錄的,且目前文件系統不一樣』的文件;
-i  :進入互動模式,可以僅還原部分文件,用在 dump 目錄時的還原!
-r  :將整個 filesystem 還原的一種模式,用在還原針對文件系統的 dump 備份;
其他較常用到的選項功能:
-h  :察看完整備份數據中的 inode 與文件系統 label 等資訊
-f  :後面就接你要處理的那個 dump 文件羅!
-D  :與 -C 進行搭配,可以查出後面接的掛載點與 dump 內有不同的文件!

3.2.1 用 restore 觀察 dump 後的備份數據內容

要找出 dump 的內容就使用 restore -t 來查閱即可!例如我們將 boot.dump 的文件內容捉出來看看!

[root@www ~]# restore -t -f /root/boot.dump 
Dump   date: Tue Dec  2 02:53:45 2008              <==說明備份的日期
Dumped from: the epoch
Level 0 dump of /boot on www.vbird.tsai:/dev/hdc1  <==說明 level 狀態
Label: /boot                                       <==說明該 filesystem 的表頭!
         2      .
        11      ./lost+found
      2009      ./grub
      2011      ./grub/grub.conf
....底下省略....

[root@www ~]# restore -t -f /root/etc.dump
Dump tape is compressed.                          <==加註說明數據有壓縮
Dump   date: Tue Dec  2 12:08:22 2008
Dumped from: the epoch
Level 0 dump of / (dir etc) on www.vbird.tsai:/dev/hdc2 <==是目錄!
Label: /1
         2      .
   1912545      ./etc
   1912549      ./etc/rpm
   1912550      ./etc/rpm/platform
....底下省略....

這個查閱的數據其實顯示出的是檔名與原始文件的 inode 狀態,所以我們可以說, dump 會參考 inode 的記錄哩! 透過這個查詢我們也能知道 dump 的內容爲何呢!再來查一查如何還原吧!

3.2.2 比較差異並且還原整個文件系統

爲什麼 dump 可以進行累積備份呢?就是因爲他具有可以查詢文件系統與備份文件之間的差異, 並且將分析到的差異數據進行備份的緣故。所以我們先來看看,如何查詢有變動過的資訊呢?你可以使用如下的方法檢驗:

# 0. 先嚐試變更文件系統的內容:
[root@www ~]# cd /boot
[root@www boot]# mv config-2.6.18-128.el5 config-2.6.18-128.el5-back

# 1. 看使進行文件系統與備份文件之間的差異!
[root@www boot]# restore -C -f /root/boot.dump
Dump   date: Tue Dec  2 02:53:45 2008
Dumped from: the epoch
Level 0 dump of /boot on www.vbird.tsai:/dev/hdc1
Label: /boot
filesys = /boot
restore: unable to stat ./config-2.6.18-128.el5: No such file or directory
Some files were modified!  1 compare errors
# 看到上面的特殊字體了吧!那就是有差異的部分!總共有一個文件被變更!
# 我們剛剛確實有更動過該文件,嘿嘿!這樣是否能瞭解?!

# 2. 將文件系統改回來啊!
[root@www boot]# mv config-2.6.18-128.el5-back config-2.6.18-128.el5
[root@www boot]# cd /root

如同上面的動作,透過曾經備份過的資訊,也可以找到與目前實際文件系統中有差異的數據呢! 如果你不想要進行累積備份,但也能透過這個動作找出最近這一陣子有變動過的文件說!瞭解乎? 那如何還原呢?由於 dump 是記錄整個文件系統的,因此還原時你也應該要給予一個全新的文件系統才行。 因此底下我們先創建一個文件系統,然後再來還原吧!

# 1. 先創建一個新的 partition 來使用,假設我們需要的是 150M 的容量
[root@www ~]# fdisk /dev/hdc
Command (m for help): n
First cylinder (2335-5005, default 2335): <==這裏按 Enter
Using default value 2335
Last cylinder or +size or +sizeM or +sizeK (2335-5005, default 5005): +150M
Command (m for help): p
....中間省略....
/dev/hdc8            2335        2353      152586   83  Linux

Command (m for help): w

[root@www ~]# partprobe   <==很重要的動作!別忘記!
# 這樣就能夠創建一個 /dev/hdc8 的 partition ,然後繼續格式化吧!

[root@www ~]# mkfs -t ext3 /dev/hdc8
[root@www ~]# mount /dev/hdc8 /mnt

# 2. 開始進行還原的動作!請您務必到新文件系統的掛載點底下去!
[root@www ~]# cd /mnt
[root@www mnt]# restore -r -f /root/boot.dump
restore: ./lost+found: File exists

由於我們是備份整個文件系統,因此你也可以建置一個全新的文件系統 (partition) 來進行還原的動作! 整個還原的動作也不難,如上表最後一個命令,就是將備份文件中的數據還原到本目錄下。 你必須要變更目錄到掛載點所在的那個目錄才行啊!這樣還原的文件纔不會跑錯地方!如果你還想要將 level 1 的 /root/boot.dump.1 那個文件的內容也還原的話,那就繼續使用『restore -r -f /root/boot.dump.1』去還原吧!

3.2.3 僅還原部分文件的 restore 互動模式

某些時候你只是要將備份檔的某個內容捉出來而已,並不想要全部解開,那該如何是好?此時你可以進入 restore 的互動模式 (interactive mode)。在底下我們使用 etc.dump 來進行範例說明。假如你要將 etc.dump 內的 passwd 與 shadow 捉出來而已,該如何進行呢?

[root@www ~]# cd /mnt
[root@www mnt]# restore -i -f /root/etc.dump
restore > 
# 此時你就已經進入 restore 的互動模式畫面中!要注意的是:
# 你目前已經在 etc.dump 這個文件內了!所有的動作都是在 etc.dump 內!

restore > help
Available commands are:
        ls [arg] - list directory          <==列出 etc.dump 內的文件或目錄
        cd arg - change directory          <==在 etc.dump 內變更目錄
        pwd - print current directory      <==列出在 etc.dump 內的路徑檔名
        add [arg] - add `arg' to list of files to be extracted 
        delete [arg] - delete `arg' from list of files to be extracted
        extract - extract requested files
# 上面三個命令是重點!各命令的功能爲:
# add file    :將 file 加入等一下要解壓縮的文件列表中
# delete file :將 file 移除出解壓縮的列表,並非刪除 etc.dump 內的文件!別誤會!^_^
# extract     :開始將剛剛選擇的文件列表解壓縮了去!
        setmodes - set modes of requested directories
        quit - immediately exit program
        what - list dump header information
        verbose - toggle verbose flag (useful with ``ls'')
        prompt - toggle the prompt display
        help or `?' - print this list

restore > ls
.:
etc/  <==會顯示出在 etc.dump 內主要的目錄,因爲我們備份 /etc ,所以檔名爲此!

restore > cd etc                  <==在 etc.dump 內變換路徑到 etc 目錄下
restore > pwd                     <==列出本目錄的檔名爲?
/etc
restore > ls passwd shadow group  <==看看,真的有這三個文件喔!
passwd
shadow
group
restore > add passwd shadow group <==加入解壓縮列表
restore > delete group            <==加錯了!將 group 移除解壓縮列表
restore > ls passwd shadow group
*passwd  <==有要被解壓縮的,檔名之前會出現 * 的符號呢!
*shadow
group
restore > extract                 <==開始進行解壓縮去!
You have not read any volumes yet.   <==這裏會詢問你需要的volume
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume # (none if no more volumes): 1 <==只有一個 volume
set owner/mode for '.'? [yn] n <==不需要修改權限

restore > quit                    <==離開 restore 的功能

[root@www ~]# ll -d etc
drwxr-xr-x 2 root root 1024 Dec 15 17:49 etc  <==解壓縮後,所創建出來的目錄啦!
[root@www ~]# ll etc
total 6
-rw-r--r-- 1 root root 1945 Sep 29 02:21 passwd
-r-------- 1 root root 1257 Sep 29 02:21 shadow

透過互動式的 restore 功能,可以讓你將備份的數據取出一部份,而不必全部都得解壓縮才能夠取得你想要的文件數據。 而 restore 內的 add 除了可以添加文件外,也能夠添加整個備份的『目錄』喔!

4 光盤寫入工具

4.1 mkisofs:創建映像文檔

4.2 cdrecord:光盤燒錄工具

5 其他常見的壓縮與備份工具

除了上面介紹的壓縮格式和命令以外,我們在windows上還有兩種常見的壓縮格式,分別是zip和rar。如果我們的文件是在windows平臺壓縮的,傳到linux系統中,怎麼進行解壓縮呢?或者說,我們如果我們在linux系統中,進行文件壓縮,使用什麼樣的格式和命令,在windows中方便解壓縮呢?

5.1 zip,unzip

zip和unzip不是linux系統預裝的命令,需要自行安裝。zip用於壓縮,unzip用於解壓縮。
unbuntu系統使用apt安裝:

apt-get install zip 
apt-get install unzip 

centos系統使用yum安裝:

 yum install zip
  yum install unzip

zip命令基本用法:

zip [參數] [打包後的文件名] [打包的目錄路徑]
常用參數:
-a 將文件轉成ASCII模式
-F 嘗試修復損壞的壓縮文件
-h 顯示幫助界面
-m 將文件壓縮之後,刪除源文件
-n 特定字符串 不壓縮具有特定字尾字符串的文件
-o 將壓縮文件內的所有文件的最新變動時間設爲壓縮時候的時間
-q 安靜模式,在壓縮的時候不顯示指令的執行過程
-r 將指定的目錄下的所有子目錄以及文件一起處理
-S 包含系統文件和隱含文件(S是大寫)

示例:將指定目錄/tmp壓縮成test.zip

zip -r test.zip tmp/

unzip命令基本用法:

unzip [參數] [待解壓縮文件]
常用參數:
-n 解壓縮時不要覆蓋原有的文件;
-o 不必先詢問用戶,unzip執行後覆蓋原有的文件;
-P [密碼] 使用zip的密碼選項;
-q 執行時不顯示任何信息;
-d [目錄] 指定文件解壓縮後所要存儲的目錄;

在linux下解壓zip文件,最簡單的方式就是unzip命令直接跟上要解壓的zip文件。

unzip [待解壓縮文件]

示例:
將壓縮文件text.zip在當前目錄下解壓縮。

unzip test.zip

將壓縮文件test.zip在指定目錄/tmp下解壓縮,如果已有相同的文件存在,要求unzip命令覆蓋原先的文件。

unzip -o test.zip -d tmp/

5.2 rar, unrar

rar和unrar不是linux系統預裝的命令,需要自行安裝。rar用於壓縮,unrar用於解壓縮。
同樣的ubuntu安裝rar和unrar可以使用apt。
centos可以下載源碼進行安裝。
下載:

mkdir -p  /home/oldboy/tools
cd /home/oldboy/tools
wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz

安裝:

tar zxvf rarlinux-3.8.0.tar.gz
cd rar
make
make install 

示例:
將/etc 目錄壓縮爲etc.rar 命令爲:

rar a etc.rar /etc

將etc.rar 解壓 命令爲:

rar x etc.rar  或 unrar -e etc.tar

更多參數可以輸入rar進行查看。

主要摘抄自鳥哥的linux私房菜第九章、文件與文件系統的壓縮與打包
同時部分內容來自以下博客:

  1. Linux常用命令: zip、unzip 壓縮和解壓縮命令
  2. linux下rar包的解壓方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章