[TOC]
一、文件壓縮程序
數(shù)據(jù)壓縮是一個(gè)刪除冗余數(shù)據(jù)的過(guò)程。游程編碼是最基本的數(shù)據(jù)壓縮技術(shù)。
壓縮算法:
- 無(wú)損壓縮:保留原始文件的所有數(shù)據(jù)。
- 有損壓縮:執(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 塊排序文件壓縮器
-
bzip2與gzip程序相似,但是使用了不同的壓縮算法,舍棄了壓縮速度,實(shí)現(xiàn)了更高的壓縮級(jí)別。 - 由
bzip2壓縮的文件,用擴(kuò)展名 .bz2 來(lái)表示。 - 伴隨著
bzip2程序,有bunzip2和bzcat程序來(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 命令 ,gzip 和 bzip2 壓縮兩者都直接支持,各自使用 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