檔案的打包、壓縮與備份
檔案的打包、壓縮與備份
版本: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] , 就能夠到第二行繼續輸入了。