17. Linux 壓縮、歸檔和備份

[TOC]

一、文件壓縮程序

數(shù)據(jù)壓縮是一個(gè)刪除冗余數(shù)據(jù)的過(guò)程。游程編碼是最基本的數(shù)據(jù)壓縮技術(shù)。

壓縮算法:

  1. 無(wú)損壓縮:保留原始文件的所有數(shù)據(jù)。
  2. 有損壓縮:執(zhí)行壓縮操作時(shí)會(huì)刪除數(shù)據(jù),允許更大的壓縮。

gzip 文件壓縮與解壓

gzip 程序被用來(lái)壓縮一個(gè)或多個(gè)文件(?? gzip 不可以壓縮目錄)。當(dāng)執(zhí)行 gzip 命令時(shí),原始文件的壓縮版會(huì)替代原始文件。相對(duì)應(yīng)的 gunzip 程序被用來(lái)把壓縮文件復(fù)原為沒(méi)有被壓縮的版本。

gzip 選項(xiàng) 說(shuō)明
-c 把輸出寫入到標(biāo)準(zhǔn)輸出,并且保留原始文件。也有可能用 --stdout 和 --to-stdout 選項(xiàng)來(lái)指定。
-d 解壓縮。正如 gunzip 命令一樣。也可以用 --decompress 或者 --uncompress 選項(xiàng)來(lái)指定.
-f 強(qiáng)制壓縮,即使原始文件的壓縮文件已經(jīng)存在了,也要執(zhí)行。也可以用 --force 選項(xiàng)來(lái)指定。
-h 顯示用法信息。也可用 --help 選項(xiàng)來(lái)指定。
-l 列出每個(gè)被壓縮文件的壓縮數(shù)據(jù)。也可用 --list 選項(xiàng)。
-r 若命令的一個(gè)或多個(gè)參數(shù)是目錄,則遞歸地壓縮目錄中的文件。也可用 --recursive 選項(xiàng)來(lái)指定。
-t 測(cè)試壓縮文件的完整性。也可用 --test 選項(xiàng)來(lái)指定。
-v 顯示壓縮過(guò)程中的信息。也可用 --verbose 選項(xiàng)來(lái)指定。
-number 設(shè)置壓縮指數(shù)。number 是一個(gè)在 1(最快,最小壓縮)到 9(最慢,最大壓縮)之間的整數(shù)。 數(shù)值 1 和 9 也可以各自用 --fast 和 --best 選項(xiàng)來(lái)表示。默認(rèn)值是整數(shù) 6。

簡(jiǎn)單示例:

# 壓縮
$ gzip linux_book_bak.tar        ## 壓縮一個(gè)打包文件
$ gzip -l linux_book_bak.tar     ## 查看壓縮效果
$ gzip -tv linux_book_bak.tar    ## 測(cè)試壓縮文件完整性

# 解壓縮
$ gunzip linux_book_bak.tar.gz     ## 解壓縮文件
$ gzip -d linux_book_bak.tar.gz    ## 同上

完整示例:

# 創(chuàng)建一個(gè)文本文件,其內(nèi)容包含一個(gè)目錄的列表清單。
$ ls -l /etc > foo.txt

# 查看文件大小(11K)
$ ls -lh foo.*
-rw-r--r-- 1 root root 11K Jan 19 09:34 foo.txt

# 壓縮文件,同時(shí)會(huì)刪除源文件。
$ gzip foo.*

# -t 測(cè)試壓縮文件的完整性
gzip -tv foo.*
foo.txt.gz:      OK

# 查看壓縮文件大?。?.3k)
$ ls -lh foo*
-rw-r--r-- 1 root root 2.3K Jan 19 09:34 foo.txt.gz

# 不解壓縮,只是瀏覽壓縮文本文件的內(nèi)容
$ gunzip -c foo.* | less

# 解壓縮文件
$ gunzip foo.*
$ gzip -d foo* # 同上

# 查看解壓縮文件大?。?1K)
$ ls -lh foo.*
-rw-r--r-- 1 root root 11K Jan 19 09:34 foo.txt

相關(guān)命令:zcat、zless。

bzip2 塊排序文件壓縮器

  • bzip2gzip 程序相似,但是使用了不同的壓縮算法,舍棄了壓縮速度,實(shí)現(xiàn)了更高的壓縮級(jí)別。
  • bzip2 壓縮的文件,用擴(kuò)展名 .bz2 來(lái)表示。
  • 伴隨著 bzip2 程序,有 bunzip2bzcat 程序來(lái)解壓縮文件。
  • bzip2 文件也帶有 bzip2recover 程序,其會(huì)試圖恢復(fù)受損的 .bz2 文件。

語(yǔ)法:bzip2 [-dz] filename

  • -d:解壓縮;
  • -z:壓縮。

示例代碼:

# 壓縮文件
$ bzip2 foo.txt

# 查看壓縮文件大?。?.1k)
$ ls -lh foo.*
-rw-r--r-- 1 root root 2.1K Jan 19 09:34 foo.txt.bz2

# 解壓縮文件
$ bunzip2 foo.*

# 查看解壓縮文件大?。?1k)
$ ls -lh foo.*
-rw-r--r-- 1 root root 11K Jan 19 09:34 foo.txt

??????
【不要強(qiáng)迫性壓縮】
不要壓縮一個(gè)已經(jīng)被壓縮過(guò)的文件。 如果你再次壓縮已經(jīng)壓縮過(guò)的文件,實(shí)際上你會(huì)得到一個(gè)更大的文件。

二、 歸檔程序

歸檔就是收集許多文件,并把它們捆綁成一個(gè)大文件的過(guò)程。

打包&壓縮:

  • 打包(歸檔):將一大堆文件或目錄變成一個(gè)總的文件;
  • 壓縮:將一個(gè)大的文件通過(guò)一些壓縮算法變成一個(gè)小文件。
文件名后綴 壓縮工具
.gz gzip 壓縮工具壓縮的文件
.bz2 bzip2 壓縮工具壓縮的文件
.tar tar 打包程序打包的文件 (tar 并沒(méi)有壓縮功能,只是把一個(gè)目錄合并成一個(gè)文件)
.tar.gz 可以理解為先用 tar 打包,然后再 gzip 壓縮
.tar.bz2 同上,先用 tar 打包,然后再 bzip2 壓縮

tar 磁帶打包工具

  • 利用 tar (tape archive,磁帶存檔)命令,可以把一大堆的文件和目錄全部打包成一個(gè)文件,這對(duì)于備份文件或?qū)讉€(gè)文件組合成為一個(gè)文件以便于網(wǎng)絡(luò)傳輸是非常有用的。
  • 我們經(jīng)常看到擴(kuò)展名為 .tar 或者 .tgz 的文件,它們各自表示 “普通” 的 tar 包和被 gzip 程序壓縮過(guò)的 tar 包。
  • 設(shè)置 tar 命令參數(shù)時(shí),必須首先指定模式,然后才是其它的選項(xiàng)。
tar 模式 說(shuō)明
c 為文件和/或目錄列表創(chuàng)建歸檔文件。
x 抽取歸檔文件。
r 追加具體的路徑到歸檔文件的末尾。
t 列出歸檔文件的內(nèi)容。
  • 默認(rèn)情況下,路徑名是相對(duì)的,而不是絕對(duì)路徑。

語(yǔ)法:tar [-zjxcvfpP] filename

參數(shù) 含義
-z 是否同時(shí)用 gzip 壓縮
-j 是否同時(shí)用 bzip2 壓縮
-x 解包或者解壓縮
-t 查看 tar 包里面的文件
-c 創(chuàng)建歸檔文件
-v 可視化,顯示命令的執(zhí)行過(guò)程
-f 后面跟文件名,壓縮時(shí)跟 -f 文件名,指定歸檔文件名,解壓時(shí)跟 -f 文件名,意思是解壓filename。請(qǐng)注意,如果是多個(gè)參數(shù)組合的情況下帶有 -f,請(qǐng)把 f 寫到最后面。
-p 使用原文件的屬性,壓縮前什么屬性壓縮后還什么屬性。(不常用)
-P 可以使用絕對(duì)路徑。(不常用)

簡(jiǎn)單示例:

# 打包文件
$ tar -cvf shell.tar shell/        ## 將 shell 目錄連同其下的文件一同打包成文件 shell.tar
$ tar -czvf shell.tar.gz shell/    ## 打包并使用 gizp 壓縮文件

# 解開(kāi)文件
$ tar -xvf shell.tar
$ tar -xzvf shell.tar.gz          ## 先調(diào)用 gzip 解壓縮,再解開(kāi)文件。

完整示例:

# -p:遞歸創(chuàng)建目錄
$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
# 創(chuàng)建空文件夾
$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A-Z}

# 打包文件
# ?? 參數(shù)不需要開(kāi)頭的短橫線
tar cf playground.tar playground

# 列出包文件內(nèi)容
tar tf playground.tar
tar tvf playground.tar

# 抽取包文件內(nèi)容到新目錄
$ mkdir foo
$ cd foo
$ tar xf ../playground.tar
$ ls
playground

# 從歸檔文件(archive.tar)中抽取單個(gè)文件
$ tar xf archive.tar pathname

GNU 版本的 tar 命令(在 Linux 發(fā)行版中最常出現(xiàn))通過(guò) --wildcards 選項(xiàng)來(lái)支持通配符:

$ tar xf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A'

tar 命令經(jīng)常結(jié)合 find 命令一起來(lái)制作歸檔文件。

# 查找某個(gè)特定的文件集合,歸檔到一個(gè)文件中:
#  - exec:?jiǎn)拘褞в凶芳幽J剑╮)的 tar 命令。
$ find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'

現(xiàn)在的 GUN 版本的 tar 命令 ,gzipbzip2 壓縮兩者都直接支持,各自使用 z 和 j 選項(xiàng)。

# gzip 壓縮:z
$ find playground -name 'file-A' | tar czf playground.tgz -T -

# bzip2 壓縮:j
$ find playground -name 'file-A' | tar cjf playground.tbz -T -

zip 打包和壓縮文件

zip 程序既是壓縮工具,也是一個(gè)打包工具。然而,在 Linux 中,gzip 是主要的壓縮程序,而 bzip2 則位居第二。
格式:zip options zipfile file...

示例:

# 除非包含 -r 選項(xiàng),要不然只有 playground 目錄(沒(méi)有任何它的內(nèi)容)被存儲(chǔ)。
$ zip -r playground.zip playground

使用 unzip 程序,來(lái)直接抽取一個(gè) zip 文件的內(nèi)容。

$ unzip ../playground.zip

# - l,只列出文件包中的內(nèi)容而沒(méi)有抽取文件。
$ unzip -l playground.zip playground/dir-87/file-Z

# 有選擇地從一個(gè) zip 文件包中抽取文件,只要給 unzip 命令指定文件名:
unzip ./playground.zip playground/dir-87/file-Z

對(duì)于 zip 命令(與 tar 命令相反)要注意一點(diǎn),就是如果指定了一個(gè)已經(jīng)存在的文件包,其被更新而不是被替代。這意味著會(huì)保留此文件包,但是會(huì)添加新文件,同時(shí)替換匹配的文件。

三、同步文件和目錄

維護(hù)系統(tǒng)備份的常見(jiàn)策略是保持一個(gè)或多個(gè)目錄與另一個(gè)本地系統(tǒng)(通常是某種可移動(dòng)的存儲(chǔ)設(shè)備)或者遠(yuǎn)端系統(tǒng)中的目錄(或多個(gè)目錄)同步。

rsync 遠(yuǎn)程數(shù)據(jù)同步工具

  • rsync 程序能同步本地與遠(yuǎn)端的目錄,通過(guò)使用 rsync 遠(yuǎn)端更新協(xié)議,允許 rsync 快速地檢測(cè)兩個(gè)目錄的差異,執(zhí)行最小量的復(fù)制來(lái)達(dá)到目錄間的同步(增量同步?)。
  • rsync 程序的真正好處之一,是它可以被用來(lái)在網(wǎng)絡(luò)間復(fù)制文件。
  • 通過(guò)使用 rsync 服務(wù)器。rsync 可以被配置為一個(gè)守護(hù)進(jìn)程,監(jiān)聽(tīng)即將到來(lái)的同步請(qǐng)求。

示例:

# 同步 playground 目錄和它在 foo 目錄中相對(duì)應(yīng)的副本
# - a 選項(xiàng)(遞歸和保護(hù)文件屬性)
# - v 選項(xiàng)(冗余輸出)
$ rsync -av playground foo

四、備份文件系統(tǒng)

dump 備份文件系統(tǒng)

  • dump 使用“備份級(jí)別”實(shí)現(xiàn)增量備份,即每次級(jí)別為 N 的備份會(huì)對(duì)從上次級(jí)別小于 N 的備份以來(lái),修改過(guò)的文件執(zhí)行備份。
  • 使用 dump 進(jìn)行增量備份時(shí),只能在像磁帶這樣的字符設(shè)備上進(jìn)行。如果一定要使用硬盤做備份,只能進(jìn)行 0 級(jí)備份。
$ dump -0u -f /dev/nst0 /web    ## 執(zhí)行從 /web 到 /dev/nst0 的 0級(jí)備份

# 參數(shù)含義
# -0: 執(zhí)行 0 級(jí)備份,備份級(jí)別共有10個(gè)(0~9),0表示完整備份;
#
# -u: 1.指定 dump 更新 /etc/dumpdates 文件,該文件類似于一個(gè)備份日志文件;
#     2.該選項(xiàng)要求備份的必須是一個(gè)完整的文件系統(tǒng);
#
# -f: 指定用于存放備份的設(shè)備;
#

$ rdump -0u -f backup:/dev/nst0 /web    ## 將備份轉(zhuǎn)儲(chǔ)到遠(yuǎn)程主機(jī)上

restore 從災(zāi)難中恢復(fù)

# 1. 需要建立一個(gè)臨時(shí)目錄
$ mkdir /var/restore       ## 建立用于恢復(fù)文件的目錄 /var/restore
$ cd /var/restore

# 2. 從備份設(shè)備中提取數(shù)據(jù)
# -i: 交互式地恢復(fù)單個(gè)文件和目錄
# -f: 指定存放備份的設(shè)備
$ restore -i -f /dev/sdb3

# 3. 進(jìn)入交互式命令行界面
# 用 add xxx 標(biāo)記需要恢復(fù)的文件
# 最后用 extract 命令提取所有做過(guò)標(biāo)記的文件和目錄
# quit 退出 restore

# -r: 恢復(fù)整個(gè)文件系統(tǒng)
$ restore -r -f /dev/sdb3
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容