?打包和壓縮
雖然打包和壓縮都涉及將多個文件組合成單個實體,但它們之間存在重要差異。
打包和壓縮的區別:
- 打包是將多個文件或目錄組合在一起,但不對其進行壓縮。這意味著打包后的文件大小可能與原始文件相同或更大。此外,打包后的文件仍然可以直接訪問其中的每個文件。
- 壓縮是將一個或多個文件通過特定算法壓縮成一個更小的文件。這通常會減小該實體的大小,并且需要特殊工具才能訪問其中的內容。
在Linux中,? gzip、bzip2、xz大多僅能針對單一文件來進行壓縮,雖然gzip、bzip2、xz也能夠針對目錄來進行壓縮,不過,這三個命令對目錄的壓縮指的是將目錄內的所有文件【分別】進行壓縮的操作。
而不像在Windows的系統,可以使用類似WinRAR這一類的壓縮軟件來將好多數據打包成一個文件的樣式。
????????這種將多個文件或目錄包成一個大文件的命令功能,我們可以稱它是一種打包命令,那Linux有沒有這種打包命令?
有,那就是鼎鼎大名的tar,tar 可以將多個目錄或文件打包成一個大文件,同的還可以通過gzip、bzip2、xz的支持,將該文件同時進行壓縮。
????????更有趣的是,由于tar的使用太廣泛了,目前Windows的WinRAR也支持.tar.gz文件名的解壓縮。很不錯吧!所以下面我們就來玩一玩這個東西。
1.tar
tar的選項與參數非常多,我們只講幾個常用的選項,更多選項您可以自行man 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? 欲解壓縮的目錄。
那個filename.tar.bz2是打完包的新文件的文件名,是我們自己取的文件名,tar并不會主動的產生建立的文件名,我們要自定義,所以擴展名就顯的很重要了。
- 如果不加[-z | -j | -J]的話,文件拓展名最好取為tar即可。
- 如果是-j選項,代表有bzip2的支持,因此文件拓展名最好就取為.tar.bz2,因為bzip2會產生.bz2的擴展名之故。
- 如果是-J選項,代表有xz的支持,文件拓展名最好取為.tar.xz
- 至于如果是加上了-z的gzip的支持,那文件拓展名最好為.tar.gz
另外,由于 【-f filename】是緊接在一起的,
- 過去很多文章常會寫成【-jcvf filename 】,這樣是對的,
- 但由于選項的順序理論上是可以變換的,所以很多讀者會誤認為【-jvfc filename】也可以,事實上這樣會導致產生的文件名變成c,因為-fc嘛。
所以,建議您在學習tar時,將【-f filename】與其他選項獨立出來,會比較不容易發生問題。
就像下面這樣子
閑話少說,讓我們來測試幾個常用的tar方法。
1.1.使用tar加入-z、-j或-J的參數備份/etc/目錄
有事沒事備份一下/etc這個目錄是件好事,備份/etc最簡單的方法就是使用tar,讓我們先來玩玩:
因為備份/etc 需要 root 的權限,否則會出現一堆錯誤.
1.1.1.-z選項
我們先看-z選項——也就是使用gzip來壓縮的
下面是命令的解釋:
- tar:這是用于打包和壓縮文件的命令。
- -z:表示使用gzip進行壓縮。
- -p:保留原有文件的權限。
- -c?:創建一個新的打包文件
- -v:顯示命令執行過程中的詳細信息。
- -f :/root/etc.tar.gz:指定輸出文件的路徑和文件名,這里是 /root/etc.tar.gz 。
- /etc:指定要打包的目錄,這里是 /etc目錄。
也就是說/etc的文件被打包到/root里面去了,叫/etc.tar.gz
執行完
?怎么樣?是不是如我所說
我們回到上面那個time tar -zpcv -f /root/etc.tar.gz /etc的執行?
注意這個警告啊,我們1.2節會講解
?多了time 會顯示程序運行的時間,看 real就好了,花去了1.616s.
- 由于加上-v這個選項,因此正在作用中的文件名就會顯示在屏幕上。
- 你會發現出現上面的錯誤信息,下面會講解。
- 至于-p的選項,重點在于【保留原本文件的權限與屬性】之意。
1.1.2.-j選項
我們再看看-j選項——也就是使用bzip2進行壓縮的
我們執行一下
用時2.089秒啊
1.1.3.-J選項
我們看看-J選項啊,也就是使用xz進行壓縮的
顯示的信息會跟上面一模一樣,不過時間會花比較多,使用了-J時,會花更多時間。
1.1.4.總結
我們來到/root目錄下面看一下結果啊
實際目錄約占有25MB的意思。
?
壓縮比越好當然要花費的運算時間越多。
- 我們從上面可以看到,雖然使用gzip的速度相當快,總時間花費不到1秒,但是壓縮率最糟糕。
- 如果使用xz的話,雖然壓縮比最佳,不過竟然花了11秒的時間。這還僅是備份25MB的/etc而已,如果備份的數據很大,那你真的要考慮時間成本才行。
至于加上【-p】這個選項的原因是為了保存原本文件的權限與屬性。我們知道權限與文件類型(例如鏈接文件)對復制的不同影響。
同樣的,在備份重要的系統數據時,這些原本文件的權限需要做完整的備份比較好。
此時-p這個選項就派的上用場了
1.2.查看tar 文件的數據內容(可查看文件名),與備份文件名有否根目錄的意義
我們在開頭說了打包了可以進去看看,那現在讓我們看著打包文件內有什么數據存在?
要查tar 文件內部的文件列表非常的簡單,可以這樣做:
我們拿我們已經打包好的/root/etc.tar.bz2來試試
………(前面省略)……
????????如果加上-v這個選項時,詳細的文件權限/屬性都會被列出來。如果只是想要知道文件名而已那么就將-v拿掉即可。
從上面的數據我們可以發現一件很有趣的事情,那就是每個文件名都沒了根目錄。
這也是上一個練習中出現的那個警告信息所告知的情況。
那為什么要去掉根目錄?
主要是為了安全。
????????我們使用tar備份的數據可能會需要解壓縮回來使用,在tar 所記錄的文件名(就是我們剛剛使用tar-jtvf所查看到的文件名)那就是解壓縮后的實際文件名。
????????如果拿掉了根目錄,假設你將備份數據在/tmp 解開,那么解壓縮的文件名就會變成【/tmp/etc/xxx】,但如果沒有去掉根目錄,解壓縮后的文件名就會是絕對路徑,即解壓縮后的數據一定會被放置到/etc/xxx去,如此一來,你的原本的/etc/下面的數據,就會被備份數據所覆蓋。
你會說,既然是備份數據,那么還原回來也沒有什么問題吧?
????????想象一個狀況,你備份的數據是兩年前的舊版CentOS6.x,你只是想要了解一下過去的備份內容究竟有哪些數據而已,結果一解開該文件,卻發現你目前新版的CentOS7.x下面的/etc 被舊版的備份數據覆蓋。
????????此時你該如何是好?大概除了哭你也不能做啥事吧?
所以,當然是拿掉根目錄比較安全一些。
如果你確定你就是需要備份根目錄到tar的文件中,那可以使用-P(大寫)這個選項,請看下面的例子分析:
- -P:保留絕對路徑,亦是允許備份數據中含有根目錄的存在
范例:將文件名中的(根)目錄也備份下來,并查看一下備份文件的內容文件名。
我們先把/etc目錄備份(帶上根目錄式的備份)到/root下面的一個叫etc.and.root.bz2
我們來查看一下這個打包文件里是什么
# 這次查看文件名不含-v選項,所以僅有文件名而已,沒有詳細屬性/權限等參數.
有發現不同點了吧?如果加上-P選項,那么文件名內的根目錄就會存在。
不過,個人建議。還是不要加上-P這個選項來備份。
????????畢竟很多時候,我們備份是為了要未來追蹤問題用的,倒不一定需要還原回原本的系統中。所以拿掉根目錄后,備份數據的應用會比較有彈性,也比較安全。
1.3.將備份的數據解壓縮,并考慮特定目錄的解壓縮操作(-C選項的應用)
那如果想要解打包?
很簡單的操作就是直接進行解打包嘛。
………(前面省略)……
此時該打包文件會在本目錄(我的是/root)下進行解壓縮的操作。
所以,你等一下就會在根目錄下面發現一個名為etc的目錄。
所以,如果你想要將該文件在/tmp下面解開,可以cd/tmp后,再執行上述的命令即可。
不過,這樣好像很麻煩,有沒有更簡單的方法可以指定欲解開的目錄?
有,可以使用-C 這個選項
- -C 目錄:這個選項用在解壓縮、若要在特定目錄解壓縮、可以使用這個選項。
這樣一來,你就能夠將該文件在不同的目錄解開,鳥哥個人是認為,這個-C的選項務必要記憶
一下,好了,處理完畢后,
請記得將這兩個目錄刪除一下。
再次強調,這個【rm-rf】是很危險的命令,執行時請務必要確認一下后面接的文件名,我們要
刪除的是/root/etc與/tmp/etc,您可不要將/etc/刪除了,系統會死掉的。
1.4.僅解開單一文件的方法
剛剛上面我們解壓縮都是將整個打包文件的內容全部解開。
想象一個情況,如果我只想要解開打包文件內的其中一個文件而已,那該如何做?
很簡單,你只要使用-jtv找到你要的文件名,然后將該文件名解開即可,我們用下面的例子來說明一下:
# 1、先找到我們要的文件名,
假設解開 shadow 文件。
先查找重要的文件名,其中那個 grep是截取關鍵詞的功能.
這里您先有個概念即可,那個管道 | 配合grep 可以截取關鍵詞的意思。
2.將該文件解開,語法與實際做法如下。
tar -jxv -f 打包文件.tar.bz2 待解開文件名
這個單一文件被解開到當前目錄來了
很有趣。此時只會解開一個文件而已不過,重點是那個文件名,你要找到正確的文件名。
在本例中,你不能寫成/etc/shadow,因為記錄在etc.tar.bz2內的并沒有/。
????????在這個練習之前,你可能要先將前面練習所產生的/root/etc刪除才行/root/etc/shadow會重復存在,而其他的前面實驗的文件也會存在,那就看不出什么了。
1.5.打包某目錄,但不含該目錄下的某些文件之做法
????????假設我們想要打包 /etc/? ? ?/root 這幾個重要的目錄,但卻不想要打包/root/etc*開頭的文件,因為該文件都是剛剛我們才建立的備份文件。
????????而且假設這個新的打包文件要放置為/root/system.tar.bz2,當然這個文件自己不要打包自己(因為這個文件放置在/root 下面),此時我們可以通過-—exclude的幫忙。
- --exclude=FILE:在壓縮的過程中,不要將 FILE打包;
這個exclude就是不包含的意思,所以你可以這樣做:
上面的命令其實是一整列,不過為了方便,我改成了兩行輸入
如果想要兩行輸入時,最后面加上反斜杠(\)并立刻按下[Enter],就能夠到第二行繼續輸入了
通過這個--exclude="file"的操作,我們可以將幾個特殊的文件或目錄排除在打包之列,讓打包的操作變的更簡便。
1.6.僅備份比某個時刻還要新的文件
某些情況下你會想要備份新的文件而已,并不想要備份舊文件,此時--newer-mtime 這個選項就很重要。
其實有兩個選項,一個是【--newer 】,另一個就是【--newer-mtime】,這兩個選項有何不同?
我們在touch介紹中談到過三種不同的時間參數,
- 當使用--newer時,表示后續的日期包含mtime與ctime,
- 而--newer-mtime 則僅是mtime而已
這樣知道了吧!那就讓我們來嘗試處理一下。
1.先由find找出比/etc/passwd還要新的文件。
?#此時會顯示出比/etc/passwd這個文件的mtime還要新的文件名
#這個結果在每臺主機都不相同,您先自行查看自己的主機即可,不會跟我的一樣。
好了,那么使用tar 來進行打包吧!日期為上面看到的2024/07/07
?最后行顯示的是【沒有被備份的】,亦即not dumped的意思
3.顯示出文件即可
通過這個命令可以調用出tar.bz2內的結尾非/的文件名,就是我們要的。
????????現在你知道這個命令的好用了吧!
????????甚至可以進行差異文件的記錄與備份,這樣的備份就會顯得更容易。你可以這樣想象,如果我在一個月前才進行過一次完整的數據備份,那么這個月想要備份時,當然可以僅備份上個月進行備份的那個時間點之后的更新的文件即可。
為什么?
因為原本的文件已經有備份了,干嘛還要進行一次?只要備份新數據即可,這樣可以降低備份的容量。
?