1. 程式人生 > 其它 >Linux 基礎(11) - 檔案與檔案系統的壓縮,打包與備份

Linux 基礎(11) - 檔案與檔案系統的壓縮,打包與備份

1. 統常見的壓縮指令

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

1.1 gzip

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

當使用 gzip 進行壓縮時,在預設的狀態下原本的檔案會被壓縮成為 .gz 的檔名,原始檔就不再存在了。
這點與一般習慣使用 windows 做壓縮的朋友所熟悉的情況不同喔!要注意!要注意!

zcat 文件名.gz

由於 services 這個原本的檔案是是文字檔案,因此我們可以嘗試使用 zcat/zmore/zless 去讀取
此時螢幕上會顯示 servcies.gz 解壓縮之後的原始檔內容!

gzip -d services.gz
與 gzip 相反, gzip -d 會將原本的 .gz 刪除,回覆到原本的 services 檔案。

gzip -9 -c services > services.gz
將解開的 services 用最佳的壓縮比壓縮,並保留原本的檔案

zgrep -n 'http' services.gz
從 services.gz 中,找出 http 這個關鍵詞在哪幾行?

1.2 bzip2, bzcat/bzmore/bzless/bzgrep

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

services 會變成 services.bz2, bzip2 的壓縮比要較 gzip 好,壓縮率由 gzip 的 61% 提升到 bzip2 的 62% !

bzcat 文件名.bz2
讀取bz2壓縮檔案

bzip2 -d services.bz2
解壓bz2壓縮檔案

bzip2 -k -9 services
保留原始檔並壓縮檔案

1.3 xz, xzcat/xzmore/xzless/xzgrep

雖然 bzip2 已經具有很棒的壓縮比,不過顯然某些自由軟體開發者還不滿足,因此後來還推出了 xz 這個壓縮比更高的軟體!
xz [-dtlkc#] 文件名
選項與引數:
-d :就是解壓縮啊!
-t :測試壓縮檔案的完整性,看有沒有錯誤
-l :列出壓縮檔案的相關資訊
-k :保留原本的檔案不刪除~
-c :同樣的,就是將資料由螢幕上輸出的意思!
-# :同樣的,也有較佳的壓縮比的意思!

xcat 文件名.xz

xz -d 文件名.xz

2.打包指令: tar

前面談到的指令大多僅能針對單一檔案來進行壓縮,雖然 gzip, bzip2, xz 也能夠針對目錄來進行壓縮,不過,這兩個指令對目錄的壓縮指的是『將目錄內的所有檔案 "分別" 進行壓縮』的動作!
而不像在 Windows 的系統可以使用類似 WinRAR 這一類的壓縮軟體來將好多資料『包成一個檔案』的樣式。這種將多個檔案或目錄包成一個大檔案的指令功能,我們可以稱呼他是一種『打包指令』!
那 Linux 鼎鼎大名的 tar 打包指令! tar 可以將多個目錄或文 件打包成一個大檔案,同時還可以透過 gzip/bzip2/xz 的支援,將該檔案同時進行壓縮。

tar的選項與引數
tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename... <打包與壓縮
tar [-z|-j|-J] [tv] [-f 既有的 tar 文件名] <
檢視文件名
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 就只要記憶底下的方式即可:

  • 壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱
  • 查 詢:tar -jtv -f filename.tar.bz2
  • 解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄

2.1 tar 壓縮

2.1.1 使用 tar 加入 -z, -j 或 -J 的引數備份 /etc/ 目錄

time tar -zpcv -f /root/etc.tar.gz /etc
time tar -jpcv -f /root/etc.tar.bz2 /etc
time tar -Jpcv -f /root/etc.tar.xz /etc


從上面的資料我們可以發現一件很有趣的事情,那就是每個檔名都沒了根目錄了!出現了警告訊息『tar:從成員名中刪除了檔名開頭的 "/" )』
那為什麼要拿掉根目錄呢?主要是為了安全,我們使用 tar 備份的資料可能會需要解壓縮回來使用,在 tar 所記錄的檔名 (就是我們剛剛使用 tar -jtvf 所察看到的文件名) 那就是解壓縮後的實際檔名。
如果拿掉了根目錄,假設你將備份資料在 /tmp 解開,那麼解壓縮的檔名就會變成『/tmp/etc/xxx』。但『如果沒有拿掉根目錄,解壓縮後的檔名就會是絕對路徑, 亦即解壓縮後的資料一定會被放置到 /etc/xxx 去!』
如此一來,你的原本的 /etc/ 底下的資料, 就會被備份資料所覆蓋過去了!

2.1.2 全路徑備份 -P 選項

tar -jpPcv -f /root/fullpath_etc.and.root.tar.xz /etc

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

2.1.3 打包某目錄,但不含該目錄下的某些檔案之作法

tar -jcv -f /root/root.tar.bz2 --exclude=/root/etc*

上面的指令是一整列的~其實你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,
如果想要兩行輸入時,最後面加上反斜槓 () 並立刻按下[enter] , 就能夠到第二行繼續輸入了。

2.1.4 僅備份比某個時刻還要新的檔案 --newer-mtime 選項

1)先由 find 找出比 /etc/passwd 還要新的檔案
find /etc -newer /etc/passwd
2)使用 tar 來進行打包!日期為上面看到的 2015/06/17
tar -jcv -f /root/etc.newwer.20200509.tar.bz2 --newer-mtime="2020/05/09" /etc/*

2.2 tar 檢視壓縮文件

tar -ztv -f /root/etc.tar.gz
tar -jtf -f /root/etc.root.tar.bz2
tar -Jtv -f /root/etc1.tar.xz
查閱 tar 檔案的資料內容 (可檢視文件名),與備份檔名有否根目錄的意義

2.3 tar 解壓壓縮文件

2.3.1 解壓到當前目錄

tar -Jxv -f /root/etc1.tar.xz

2.3.2 解壓到指定目錄

tar -Jxv -f /root/ect1.tar.xz -C /tmp

2.3.3 僅解開單一檔案的方法

1)先找到我們要的檔名,假設解開 shadow 檔案好了
tar -Jtv -f /root/etc.tar.xz | grep 'shadow'
2)將該檔案解開!語法與實際作法如下:
tar -Jxv -f /root/etc.tar.xz etc/shadow -C /root/etc/shadow