上一篇文章談到的命令大多僅能針對單一文件來進行壓縮,儘管 gzip 與 bzip2 也能夠針對文件夾來進行壓縮, 只是。這兩個命令對文件夾的壓縮指的是『將文件夾內的所有文件 "分別" 進行壓縮』的動做!php
而不像在 Windows 的系統。可使用相似 WinRAR 這一類的壓縮軟件來將好多數據『包成一個文件』的樣式。
這樣的將多個文件或文件夾包成一個大文件的命令功能,咱們可以稱呼他是一種『打包命令』啦! 那 Linux 有沒有這樣的打包命令呢?是有的!那就是鼎鼎大名的 tar 這個玩意兒了!linux
tar 可以將多個文件夾或文件打包成一個大文件,同一時候還可以透過 gzip/bzip2 的支持,將該文件同一時候進行壓縮! 更有趣的是。由於 tar 的使用太普遍了。眼下 Windows 的 WinRAR 也支持 .tar.gz 檔名的解壓縮呢。
安全
[root@www ~]# tar [-j|-z] [cv] [-f 建立的檔名] filename... <==打包與壓縮 [root@www ~]# tar [-j|-z] [tv] [-f 建立的檔名] <==察看檔名 [root@www ~]# tar [-j|-z] [xv] [-f 建立的檔名] [-C 文件夾] <==解壓縮 選項與參數: -c :建立打包文件,可搭配 -v 來察看過程當中被打包的檔名(filename) -t :察看打包文件的內容含有哪些檔名,重點在察看『檔名』就是了; -x :解打包或解壓縮的功能。可以搭配 -C (大寫) 在特定文件夾解開 特別留意的是, -c, -t, -x 不可同一時候出現在一串命令列中。 -j :透過 bzip2 的支持進行壓縮/解壓縮:此時檔名最好爲 *.tar.bz2 -z :透過 gzip 的支持進行壓縮/解壓縮:此時檔名最好爲 *.tar.gz -v :在壓縮/解壓縮的過程當中,將正在處理的檔名顯示出來。 -f filename:-f 後面要立馬接要被處理的檔名!建議 -f 單獨寫一個選項羅! -C 文件夾 :這個選項用在解壓縮,若要在特定文件夾解壓縮。可以使用這個選項。 |
事實上最簡單的使用 tar 就僅僅要記憶底下的方式就能夠:
壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的文件或文件夾名稱
查 詢:tar -jtv -f filename.tar.bz2
解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的文件夾
session
那個 filename.tar.bz2 是咱們本身取的檔名,tar 並不會主動的產生建立的檔名喔!咱們要自訂啦。 因此擴展名就顯的很是重要了。假設不加 [-j|-z] 的話,檔名最好取爲 *.tar 就能夠。假設是 -j 選項,表明有 bzip2 的支持,所以檔名最好就取爲 *.tar.bz2 ,因爲 bzip2 會產生 .bz2 的擴展名之故! 至於假設是加上了 -z 的 gzip 的支持,那檔名最好取爲 *.tar.gz 。
post
另外,由於『 -f filename 』是緊接在一塊兒的。過去很是多文章常會寫成『-jcvf filename』。這樣是對的, 但由於選項的順序理論上是可以變換的,因此很是多讀者會誤以爲『-jvfc filename』也可以~其實這樣會致使產生的檔名變成 c !學習
因爲 -fc 嘛!因此羅,建議您在學習 tar 時。將『 -f filename 』與其它選項獨立出來。會比較不easy發生故障。
spa
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 ....前面省略.... -rw-r--r-- root/root 1016 2008-05-25 14:06:20 etc/dbus-1/session.conf -rw-r--r-- root/root 153 2007-01-07 19:20:54 etc/esd.conf -rw-r--r-- root/root 255 2007-01-06 21:13:33 etc/crontab |
假設僅僅是想要知道檔名而已, 那麼就將 -v 拿掉就能夠。從上面的數據咱們可以發現一件很是有趣的事情。那就是每個檔名都沒了根文件夾了!這也是上一個練習中出現的那個警告信息『tar: Removing leading `/' from member names(移除了檔名開頭的 `/' )』所告知的狀況。
那爲何要拿掉根文件夾呢?主要是爲了安全!咱們使用 tar 備份的數據可能會需要解壓縮回來使用, 在 tar 所記錄的檔名 (就是咱們剛剛使用 tar -jtvf 所察看到的檔名) 那就是解壓縮後的實際檔名。crontab
假設拿掉了根文件夾,假設你將備份數據在 /tmp 解開,那麼解壓縮的檔名就會變成『/tmp/etc/xxx』。ip
但『假設沒有拿掉根文件夾,解壓縮後的檔名就會是絕對路徑。 亦即解壓縮後的數據必定會被放置到 /etc/xxx 去!
』如此一來,你的本來的 /etc/ 底下的數據, 就會被備份數據所覆蓋過去了!
範例:將檔名中的(根)文件夾也備份下來,並察看一下備份檔的內容檔名 [root@www ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc ....中間過程省略.... [root@www ~]# tar -jtf /root/etc.and.root.tar.bz2 /etc/dbus-1/session.conf /etc/esd.conf /etc/crontab # 此次查閱檔名不含 -v 選項。因此僅有檔名而已。沒有具體屬性/權限等參數。 |
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 [root@www ~]# ll ....(前面省略).... drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc ....(後面省略).... |
只是。這樣好像很是麻煩呢~有沒有更簡單的方法可以『指定欲解開的文件夾』呢? 有的,可以使用 -C 這個選項喔!
舉例來講:
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp [root@www ~]# ll /tmp ....(前面省略).... drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc ....(後面省略).... |
# 1. 先找到咱們要的檔名。若是解開 shadow 文件好了: [root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow' -r-------- root/root 1230 2008-09-29 02:21:20 etc/shadow- -r-------- root/root 622 2008-09-29 02:21:20 etc/gshadow- -r-------- root/root 636 2008-09-29 02:21:25 etc/gshadow -r-------- root/root 1257 2008-09-29 02:21:25 etc/shadow <==這是咱們要的! # 先搜尋重要的檔名! |
[root@www ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \ > --exclude=/root/system.tar.bz2 /etc /root |
# 1. 先由 find 找出比 /etc/passwd 還要新的文件 [root@www ~]# find /etc -newer /etc/passwd ....(過程省略).... # 此時會顯示出比 /etc/passwd 這個文件的 mtime 還要新的檔名, # 這個結果在每部主機都不一樣樣! |
另外值得一提的是,tar 打包出來的文件有沒有進行壓縮所獲得文件稱呼不一樣喔! 假設僅是打包而已。就是『 tar -cv -f file.tar 』而已。這個文件咱們稱呼爲 tarfile 。 假設還有進行壓縮的支持,好比『 tar -jcv -f file.tar.bz2 』時,咱們就稱呼爲 tarball (tar 球?)! 這僅僅是一個主要的稱謂而已。只是很是多書籍與網絡都會使用到這個 tarball 的名稱!