Linux歸檔與備份——gzip、gunzip、bzip2、bunzip2、tar、zip、unzip、rsync

維護系統數據安全是計算機系統管理者的基本任務之一,及時創建系統文件的備份文件是維度系統數據安全的一種常用方法。
本節主要介紹以下命令
文件壓縮程序

  • gzip:壓縮和解壓縮文件工具
  • bzip2:塊排序文件壓縮工具

文件歸檔程序

  • tar:磁帶歸檔工具
  • zip:打包和壓縮文件

文件同步工具

  • rsync:遠程文件和目錄的同步

0.參考文獻

《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光偉 郝記生 譯, 人民郵電出版社

如有侵權,可聯繫博主刪除

更多有用的Linux知識詳解,可參加博主的Linux學習導航頁

1.文件壓縮

壓縮是爲了實現以最小的可利用空間存儲最多的數據,其中可利用空間包括內存、存儲設備或者網絡帶寬。數據壓縮是一個移除冗餘信息的過程。
壓縮算法一般分爲兩大類:無損壓縮有損壓縮。無損壓縮保留原文件的所有數據,也就是壓縮文件還原時,還原後的文件與原文件完全一致。有損壓縮在壓縮時,爲了實現更大程度的壓縮而刪除了某些數據信息,在還原時,與原文件不是完全吻合,但是差距不大。JPEG(圖像壓縮技術)和MP3(音頻壓縮技術)就是典型的有損壓縮。以下僅討論無損壓縮。

1.1 gzip—文件壓縮與解壓縮

gzip命令用於壓縮一個或更多文件。執行命令後,原文件會被其壓縮文件取代,gunzip命令則將壓縮文件還原爲原文件。例如

$ gzip foo.txt
$ ls -l
總用量 4
-rw-rw-r-- 1 lixj lixj 44 6月  10 19:02 foo.txt.gz
$ gunzip foo.txt.gz
$ ls -l
總用量 21
-rw-rw-r-- 1 lixj lixj 18 6月  10 19:02 foo.txt

可以看出,壓縮後的文件大小差不多才是原文件的1/5。我們還可以看出,壓縮厚的文件與原文件有着相同的權限和時間戳。
表1 gzip的選項

選項 功能描述
-c 將輸出內容寫到標準輸出端口並保持原文件。也可以用–stdout或者–to–stdout
-d 解壓縮,加上該選項後,gzip命令便類似於gunzip。也可以用–decompress或–uncompress
-f 強制壓縮,及時原文件的壓縮版本已經存在了。也可以用–force替代
-h 顯示有用信息,也可用–help代替
-l 列出所有壓縮文件的壓縮統計,可以用–list代替
-r 如果該命令的操作參數中有一個或是多個目錄,那麼遞歸壓縮包含在目錄中的文件,也可用–recursive代替
-t 檢驗壓縮文件的完整性,可以用–test代替
-v 在壓縮時顯示詳細信息,可以用–verbose代替
-number 設置壓縮級別,number是1(速度最快,壓縮比最小)~9(速度最慢,壓縮比最大)範圍內的一個整數。gzip默認的壓縮級別是6
$ gzip foo.txt
$ gzip -tv foo.txt.gz
foo.txt.gz:      OK

以上代碼使用參數-t、-v檢查了壓縮文件的完整性。

1.2 bzip2—犧牲速度以換取高質量的數據壓縮

bzip2程序與gzip命令功能相仿,但使用不同的壓縮算法。該算法具有高質量的數據壓縮能力,但卻降低了壓縮速度。多數情況下與gzip類似,只是以.bz2爲後綴。

$ bzip2 foo.txt
$  ls -l
總用量 4
-rw-rw-r-- 1 lixj lixj 3500 6月  15 10:24 foo.txt.bz2
$ bunzip2 foo.txt.bz2
$ ls -l
總用量 21
-rw-rw-r-- 1 lixj lixj 20725 6月  15 10:24 foo.txt

可以看出,bzip2與gzip的用法相似,且前面討論的幾乎所有選項(除了-r選項),bzip2都支持。
bzip2還配有專門的bzip2recover命令,用戶恢復損壞的.bz2文件。

2.文件歸檔

歸檔是與壓縮操作配合使用的一個常用文件管理任務。歸檔是一個聚集衆多文件並將它們組合爲一個大文件的過程。它通常作爲系統備份的一部分,而且通常也用於將舊數據從某個系統移到某些長期存儲設備的情況下。

2.1 tar—磁帶歸檔工具

tar是tape archive的縮寫,該命令最初的作用就是磁帶備份,但同樣用於其它存儲設備。tar歸檔文件可以由許多獨立的文件、一個或多個目錄層次或者兩者的混合而成。語法爲

tar mode[options] pathname ...

其中mode是指表2列出的操作模式中一種
表2 tar命令的操作模式

模式 描述
c 創建文件和/或目錄列表的歸檔文件
x 從歸檔文件中提取文件
t 在歸檔文件末尾追加指定路徑
r 列出歸檔文件的內容

2.2 zip—打包壓縮文件

zip程序既是文件壓縮工具又是文件歸檔工具。Linux用戶主要使用zip程序與Windows系統交換文件,而不是將其壓縮或者是歸檔文件。
最基本的調用方式爲:

zip options zipfile file

例如創建一個playground的zip歸檔文件,可以輸入以下命令行:

$ zip -r playground.zip playground

顯示信息

  adding: playground/ (stored 0%)
  adding: playground/dir-{009,010..99/ (stored 0%)
  adding: playground/dir-{009,0100/ (stored 0%)
  adding: playground/dir-{003,0100/ (stored 0%)
  adding: playground/dir-{007,010..99/ (stored 0%)

這些信息顯示的是每個新添歸檔文件的狀態。zip使用兩種存儲方式向歸檔文件中添加文件,一種是不對文件進行壓縮直接存儲,如本例。第二種,對文件進行壓縮後存儲,緊隨存儲方法之後顯示的數值是壓縮比。當前文件夾是空的,所以沒有對其內容進行壓縮。
利用unzip,可以直接提取zip文件中的內容

$  cd foo
$ unzip ../playground.zip

zip與tar不同的一點是,如果指定的歸檔文件已經存在,那麼zip僅僅只會更新而不是代替。這意味着原來的歸檔文件會保留下來,只是增加一些新文件,原有匹配文件則會被替換。
通過給unzip指定提取的文件名,我們也可以選擇性地從zip歸檔文件中提取文件。

$  unzip -l ../playground.zip playground/dir-{009,010..99/
Archive:  ../playground.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  06-15-2020 10:56   playground/dir-{009,010..99/
---------                     -------
        0                     1 file

使用選項-l,unzip僅僅會列出歸檔文件的內容而不會從中提取文件。

$  unzip ../playground.zip playground/dir-{009,010..99/

Archive:  ../playground.zip
   creating: playground/dir-{009,010..99/

3.同步文件和目錄

將一個或多個目錄與本地系統(通常是某種可移動存儲設備)或是遠程系統上其它目錄保持同步,是維護系統備份文件的常用方法。

3.1 rsync—遠程文件、目錄的同步

針對類Unix系統,完成這一同步任務最合適的工具當屬rsync。該命令通過運行rsync遠程更新協議,同步本地與遠程系統上的目錄。該協議允許rsync命令快速檢測到本地和遠程系統上兩個目錄之間的不同,從而以最少數量的複製動作以完成兩個目錄之間的同步。
rsync調用方式爲

rsync options source destination

這裏的source和destination是下列選項之一

  • 一個本地文件或目錄
  • 一個遠程文件或目錄,形式爲[user@]host:path;
  • 一個遠程rsync服務器,由rsync://[user@]host[:port]/path指定

我們在本地實踐rsync命令,首先清空foo目錄

$ rm -rf foo/*

接着,同步playground目錄和它在foo目錄中相應的副本:

$ rsync -av playground foo

此命令中,我們運用了-a(用於歸檔—進行遞歸歸檔並保留文件屬性)選項和-v(詳細輸出)選項,在foo目錄中生成了playground目錄的鏡像備份。該命令行除了一系列文件輸出之外,最後彙總輸出爲

sent 555 bytes  received 92 byte`在這裏插入代碼片`s  1,294.00 bytes/sec
total size is 0  speedup is 0.00

再次運行該命令,輸出結果不同

$ sending incremental file list

sent 498 bytes  received 35 bytes  1,066.00 bytes/sec
total size is 0  speedup is 0.00

注意,此時不會列出文件列表,因爲rsync目錄檢測出~/playground和~/foo/playground兩個文件夾之間並無不同,因此不需要進行任何複製操作。
如果在playground/目錄下更新一個目錄,rsync會檢測到該變化並且只複製這個剛剛更新的文件。

$ touch playground/dir-\{003\,0100/
$ rsync -av playground foo
sending incremental file list
playground/dir-{003,0100/

sent 511 bytes  received 38 bytes  1,098.00 bytes/sec
total size is 0  speedup is 0.00

3.2 在網絡上使用rsync命令

通過網絡複製文件是rsync另一個美妙之處。有兩種方法:
一種是針對已經安裝rsync命令以及諸如ssh等遠程shell程序的系統。假定本地網絡有另外一個具有足夠可利用硬盤的系統,同時希望利用遠程系統而非外部設備進行備份操作。假設遠程系統已經有一個用於存放備份文件的/backup目錄,我們便可以直接運行下面命令

$ sudo rsync -av --delet --rsh=ssh /etc /home /usr/local remote-sys:/backup

此處,一是增加了–rsh=ssh選項,該選項告訴rsync使用ssh命令作爲其遠程shell命令。第二,在destination路徑名前指定了遠程主機名,這裏是remote-sys
另外一種方法是使用resync服務器同步網絡文件,通過配置rsync運行一個守護進程監聽進來的同步請求。這種方法通常用於遠程系統的鏡像系統。

$ mkdir fefora-devel
$ rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux-core/developmengt/i386/os fedora-devel

以上例子使用rsync遠程服務的URI是由協議(rsync://)、遠程主機名和庫的路徑組成的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章