1. 程式人生 > 其它 >檔案的打包、壓縮與備份

檔案的打包、壓縮與備份

檔案的打包、壓縮與備份

版本:centos7

常見的壓縮副檔名彙總:

*.Z 			compress 程式壓縮的檔案; 
*.zip 			zip 程式壓縮的檔案;
*.gz 			gzip 程式壓縮的檔案;
*.bz2 			bzip2 程式壓縮的檔案;
*.xz 			xz 程式壓縮的檔案; 
*.tar 			tar 程式打包的資料,並沒有壓縮過;
*.tar.gz 		tar 程式打包的檔案,其中並且經過 gzip 的壓縮;
*.tar.bz2 		tar 程式打包的檔案,其中並且經過 bzip2 的壓縮;
*.tar.xz 		tar 程式打包的檔案,其中並且經過 xz 的壓縮;

Linux上常見的壓縮指令就是gzip, bzip2以及最新的xz,至於 compress 已經退流行了。這些指令通常僅能針對一個檔案來壓縮與解壓縮,如此一來, 每次壓縮與解壓縮都要一大堆檔案,豈不煩人?此時,那個所謂 的“打包軟體, tar”就顯的很重要啦!

單純的 tar 功能僅是“打包”而已,亦即是將很多檔案集結成為一個檔案, 事實上,他並沒有提供壓縮的功能,後來,GNU 計劃中,將整個 tar 與壓縮的功能結合在一起, 如此一來提供使用者更方便並且更強大的壓縮與打包功能!

LINUX下的基本壓縮指令

gzip,zcat/zmore/zless/zgrep

gzip 可以說是應用度最廣的壓縮指令了!目前 gzip 可以解開 compress, zip 與 gzip 等軟體所壓縮的檔案。至於 gzip 所建立的壓縮檔案為 *.gz 的檔名喔!

[root@asahi1 ~]# gzip [-cdtv#] 檔名

選項與引數: 
-c :將壓縮的資料輸出到螢幕上,可通過資料流重導向來處理; 
-d :解壓縮的引數; 
-t :可以用來檢驗一個壓縮檔案的一致性~看看檔案有無錯誤; 
-v :可以顯示出原檔案/壓縮檔案的壓縮比等資訊; 
-# :# 為數字的意思,代表壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!預設是 -6

將services檔案壓縮
[root@asahi1 ~]# ll
total 660
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar  7 10:58 services
[root@asahi1 ~]# gzip  -v services 
services:        79.7% -- replaced with services.gz

將services檔案解壓縮
[root@asahi1 ~]# gzip -d services.gz 
[root@asahi1 ~]# ll
total 660
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar  7 10:58 services

將解開的 services 用最佳的壓縮比壓縮,並保留原本的檔案
[root@asahi1 ~]# gzip -9 -c services > services.gz
[root@asahi1 ~]# ll
total 12
-rw-------. 1 root root 1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root   29 Mar  7 11:03 services
-rw-r--r--. 1 root root   51 Mar  7 11:03 services.gz

再次建立的 services.gz 中,找出 http 這個關鍵字在哪幾行?
[root@asahi1 ~]# zgrep -n 'http' services.gz 
14:#       http://www.iana.org/assignments/port-numbers
89:http            80/tcp          www www-http    # WorldWideWeb HTTP
90:http            80/udp          www www-http    # HyperText Transfer Protocol
91:http            80/sctp                         # HyperText Transfer Protocol
————下面省略————

bzip2,bzcat/bzmore/bzless/bzgrep

若說 gzip 是為了取代 compress 並提供更好的壓縮比而成立的,那麼 bzip2 則是 為了取代 gzip 並提供更佳的壓縮比而來的。

[root@asahi1 ~]# bzip2 [-cdkzv#] 檔名

選項與引數: 
-c :將壓縮的過程產生的資料輸出到螢幕上! 
-d :解壓縮的引數 
-k :保留原始檔案,而不會刪除原始的檔案喔! 
-z :壓縮的引數 (預設值,可以不加) 
-v :可以顯示出原檔案/壓縮檔案的壓縮比等資訊; 
-# :與 gzip 同樣的,都是在計算壓縮比的引數, -9 最佳, -1 最快!

將剛剛留下來的services 以 bzip2 壓縮
[root@asahi1 ~]# bzip2 -v services
  services:  5.409:1,  1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
[root@asahi1 ~]# ll
total 264
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 123932 Mar  7 11:05 services.bz2
-rw-r--r--. 1 root root 135489 Mar  7 11:06 services.gz

將剛剛的檔案解壓縮
[root@asahi1 ~]# bzip2 -d services.bz2 

將解開的 services 用最佳的壓縮比壓縮,並保留原本的檔案
[root@asahi1 ~]# bzip2 -9 -c services > services.bz2
[root@asahi1 ~]# ll
total 920
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar  7 11:05 services
-rw-r--r--. 1 root root 123932 Mar  7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar  7 11:06 services.gz

xz, xzcat/xzmore/xzless/xzgrep

雖然 bzip2 已經具有很棒的壓縮比,不過顯然某些自由軟體開發者還不滿足,因此後來還推出了 xz 這個壓縮比更高的軟體!這個軟體的用法也跟 gzip/bzip2 幾乎一模一 樣!

[root@asahi1 ~]# xz [-dtlkc#] 檔名
選項與引數: 
-d :就是解壓縮啊! 
-t :測試壓縮檔案的完整性,看有沒有錯誤 
-l :列出壓縮檔案的相關資訊 
-k :保留原本的檔案不刪除~ 
-c :同樣的,就是將資料由螢幕上輸出的意思! 
-# :同樣的,也有較佳的壓縮比的意思!

剛剛由 bzip2 所遺留下來的services通過 xz 來壓縮!
[root@asahi1 ~]# xz -v services
services (1/1)
  100 %        97.3 KiB / 654.6 KiB = 0.149
[root@asahi1 ~]# ll
total 364
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 123932 Mar  7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar  7 11:06 services.gz
-rw-r--r--. 1 root root  99608 Mar  7 11:05 services.xz

列出這個壓縮檔案的資訊,然後讀出這個壓縮檔案的內容
[root@asahi1 ~]# xz -l services.xz 
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1     97.3 KiB    654.6 KiB  0.149  CRC64   services.xz

將他解壓縮吧!
[root@asahi1 ~]# xz -d services.xz 
[root@asahi1 ~]# ll
total 920
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar  7 11:05 services
-rw-r--r--. 1 root root 123932 Mar  7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar  7 11:06 services.gz

保留原檔案的檔名,並且建立壓縮檔案!
[root@asahi1 ~]# xz -kv services
services (1/1)
  100 %        97.3 KiB / 654.6 KiB = 0.149                                    
[root@asahi1 ~]# ll
total 1020
-rw-------. 1 root root   1259 Feb  9 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 670293 Mar  7 11:05 services
-rw-r--r--. 1 root root 123932 Mar  7 11:25 services.bz2
-rw-r--r--. 1 root root 135489 Mar  7 11:06 services.gz
-rw-r--r--. 1 root root  99608 Mar  7 11:05 services.xz

打包指令:tar

這種將多個檔案或目錄包成一個大檔案的指令功能,我們可以稱呼他是一種“打包指令”!!

[root@asahi1 ~]# tar [-z|-j|-J] [cv] [-f 待建立的新檔名] filename		<==打包與壓縮

[root@asahi1 ~]# tar [-z|-j|-J] [tv] [-f 既有的 tar檔名]			 <==察看檔名

[root@asahi1 ~]# tar [-z|-j|-J] [xv] [-f 既有的 tar檔名] [-C 目錄]	<==解壓縮

選項與引數:
-c :建立打包檔案,可搭配-v 來察看過程中被打包的檔名(filename) 
-t :察看打包檔案的內容含有哪些檔名,重點在察看“檔名”就是了; 
-x :解打包或解壓縮的功能,可以搭配 

-C (大寫) 在特定目錄解開 
		特別留意的是,-c, -t, -x 不可同時出現在一串命令列中。 

-z :通過 gzip 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.gz 
-j :通過 bzip2 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2 
-J :通過 xz 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.xz 
		特別留意,-z, -j, -J 不可以同時出現在一串命令列中 
		
-v :在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來! 
-f filename:-f 後面要立刻接要被處理的檔名!建議 
-f 單獨寫一個選項囉!(比較不會忘記) 
-C 目錄 :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。

-p(小寫) :保留備份資料的原本許可權與屬性,常用於備份(-c)重要的配置檔案 
-P(大寫) :保留絕對路徑,亦即允許備份資料中含有根目錄存在之意; --exclude=FILE:在壓縮的過程中,不要將 FILE 打包!

壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱

查 詢:tar -jtv -f filename.tar.bz2

解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄

有事沒事備份一下 /etc 這個目錄是件好事!備份 /etc 最簡單的方法就是使用 tar !

[root@asahi1 ~]# time tar -zpcv -f /root/etc.tar.gz /etc

[root@asahi1 ~]# time tar -jpcv -f /root/etc.tar.bz2 /etc

[root@asahi1 ~]# time tar -Jpcv -f /root/etc.tar.xz /etc

[root@asahi1 ~]# ll -h /root/etc.tar.*
-rw-r--r--. 1 root root 8.8M Mar  7 16:10 /root/etc.tar.bz2
-rw-r--r--. 1 root root  10M Mar  7 16:07 /root/etc.tar.gz
-rw-r--r--. 1 root root 7.2M Mar  7 16:10 /root/etc.tar.xz

[root@asahi1 ~]# du -sh /etc/
33M     /etc/

[root@asahi1 ~]# tar -ztv -f /root/etc.tar.gz 
--------(前面省略)-----------
drwxr-xr-x root/root         0 2018-10-31 05:23 etc/glvnd/egl_vendor.d/
-rw-r--r-- root/root      1982 2020-10-14 00:13 etc/vimrc
-rw-r--r-- root/root        19 2022-03-01 10:32 etc/subuid-
-rw-r--r-- root/root        19 2022-03-01 10:32 etc/subgid-

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

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

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

[root@study ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc 

[root@study ~]# tar -jtf /root/etc.and.root.tar.bz2 
/etc/locale.conf 
/etc/hostname 
/etc/aliases.db 
# 這次查閱檔名不含 -v 選項,所以僅有檔名而已!沒有詳細屬性/許可權等引數。

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

如果只想要解開打包檔案內的其中一個檔案而已呢

[root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'

[root@study ~]# tar -jxv -f 打包檔.tar.bz2 待解開檔名 


[root@asahi1 ~]# tar -jxv -f etc.tar.bz2  etc/shadow
etc/shadow
[root@asahi1 ~]# ll etc
total 4
----------. 1 root root 563 Mar  1 10:34 shadow

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

[root@study ~]# 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] , 就能夠到第二行繼續輸入了。