首頁 > php教程 > PHP开发 > 筆記004 Linux常用的tar指令

筆記004 Linux常用的tar指令

黄舟
發布: 2016-12-26 10:47:45
原創
1286 人瀏覽過

tar 的選項與參數非常的多!我們只講幾個常用的選項。

[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 目錄    :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。

其他後續練習會使用到的選項介紹:
-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 並不會主動的產生創建的檔名喔!我們要自訂! 所以擴展名就顯的很重要了!如果不加 [-j|-z] 的話,檔名最好取為 *.tar 即可。如果是 -j 選項,代表有 bzip2 的支持,因此檔名最好就取為 *.tar.bz2 ,因為 bzip2 會產生 .bz2 的擴展名之故! 至於如果是加上了 -z 的 gzip 的支持,那檔名最好取為 *.tar.gz 喔!了解乎?

另外,由於‘ -f filename ’是緊接在一起的,過去很多文章常會寫成‘-jcvf filename’,這樣是對的, 但由於選項的順序理論上是可以變換的,所以很多讀者會誤認為『-jvfc filename』也可以~事實上這樣會導致產生的檔名變成c ! 因為 -fc 嘛!所以羅,建議您在學習 tar 時,將‘ -f filename ’與其他選項獨立出來,會比較不容易發生問題。

閒話少說,讓我們來測試幾個常用的 tar 方法吧!

使用 tar 加入 -j 或 -z 的參數備份 /etc/ 目錄

有事沒事備份一下 /etc 這個目錄是件好事!備份 /etc 最簡單的方法就是使用 tar 羅!讓我們來玩玩先:

[root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names   /etc/
....中間省略....
/etc/esd.conf
/etc/crontab
# 由於加上-v 這個選項,因此正在作用中的檔名就會顯示在螢幕上。
# 如果你可以翻到第一頁,會發現出現上面的錯誤訊息!底下會講解。
# 至於 -p 的選項,重點在於『保留原本檔案的權限與屬性』之意。

[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 顯示的資訊會跟上面一模一樣羅!

[root@www ~]# ll /root/etc*
-rw-r--r-- 1 root root  8740252 Nov 15 23:07 /root/etc.tar.bz2
-rw-r--r -- 1 root root 13010999 Nov 15 23:01 /root/etc.tar.gz
[root@www ~]# du -sm /etc
118     /etc
# 為什麼建議您使用-
118     /etc

# 為什麼建議您使用-

選項?從上面的數值你可以知道了吧? ^_^

由上述的練習,我們知道使用 bzip2 亦即 -j 這個選項來製作備份時,能夠得到比較好的壓縮比! 如上表所示,由原本的 /etc/ (118MBytes) 下降到 8.7Mbytes 左右!至於加上‘ -p ’這個選項的原因是為了保存原本檔案的權限與屬性!我們曾在第七章的 cp 指令介紹時談到權限與檔案類型(例如連結檔)對複製的不同影響。 同樣的,在備份重要的系統資料時,這些原本檔案的權限需要做完整的備份比較好。此時 -p 這個選項就派的上用場了。 接下來讓我們來看看打包文件內有什麼資料存在?

查閱 tar 檔案的資料內容(可察看檔名),與備份檔名有否根目錄的意義🎜🎜要察看檔名非常的簡單!可以這樣做:🎜

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

那為什麼要拿掉根目錄呢?主要是為了安全!我們使用 tar 備份的資料可能需要解壓縮回來使用, 在 tar 所記錄的檔名 (就是我們剛剛使用 tar -jtvf 所察看到的檔名) 那就是解壓縮後的實際檔名。 如果拿掉了根目錄,假設你將備份資料在 /tmp 解開,那麼解壓縮的檔名就會變成『/tmp/etc/xxx』。 但『如果沒有拿掉根目錄,解壓縮後的檔名就會是絕對路徑, 也就是解壓縮後的資料一定會被放置到 /etc/xxx 去! ’如此一來,你的原本的 /etc/ 底下的數據, 就會被備份數據所覆蓋過去了! Tips: 你會說:『既然是備份數據,那麼還原回來也沒有什麼問題吧? 』想像一個狀況,你備份的資料是一年前的舊版CentOS 4.x, 你只是想要了解一下過去的備份內容究竟有哪些資料而已,結果一解開該文件,卻發現你目前新版的CentOS 5.x 底下的/etc 被舊版的備份資料覆蓋了!此時你該如何是好?所以羅,當然是拿掉根目錄比較安全一些的。 如果你確定你就是需要備份根目錄到tar 的檔案中,那可以使用-P (大寫) 這個選項,請看底下的例子分析: 範例:將檔名中的(根)目錄也備份下來,並察看一下備份檔的內容檔名

[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 選項,所以只有檔名而已!沒有詳細屬性/權限等參數。

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

將備份的資料解壓縮,並考慮特定目錄的解壓縮動作 (-C 選項的應用)

那如果想要解打包呢?很簡單的動作就是直接進行解打包嘛!

[root@www ~]# tar -jxv -f /root/etc.tar.bz2
[root@www ~]# ll
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(後面省略)....

此時該打包檔案會在『本目錄下進行解壓縮』的動作! 所以,你等一下就會在家目錄底下發現一個名為 etc 的目錄羅!所以羅,如果你想要將該檔案在 /tmp 底下解開, 可以 cd /tmp 後,再下達上述的指令即可。不過,這樣好像很麻煩呢~有沒有更簡單的方法可以『指定欲解開的目錄』呢? 有的,可以使用 -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
....(後面省略)....

這樣一來,你就能夠將該檔案在不同的目錄解開羅!鳥哥個人是認為,這個 -C 的選項務必記憶一下的! 好了,處理完畢後,請記得將這兩個目錄刪除一下呢!

[root@www ~]# rm -rf /root/etc /tmp/etc

再次強調,這個『 rm -rf 』是很危險的指令!下達時請務必確認後面接的檔名。我們要刪除的是 /root/etc 與 /tmp/etc, 您可不要刪除 /etc/ 了!系統會死掉的~ ^_^

僅解開單一檔案的方法

剛剛上頭我們解壓縮都是將整個打包檔案的內容全部解開!想像一個情況,如果我只想要解開打包文件內的其中一個文件而已, 那該如何做呢?很簡單的,你只要使用 -jtv 找到你要的檔名,然後將該檔名解開即可。 我們用底下的例子來說明:

# 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  # 先搜尋重要的檔名!其中那個 grep 是『擷取』關鍵字的功能!我們會在第三篇說明!
# 這裡您先有個概念即可!那個管線 | 配合 grep 可以擷取關鍵字的意思!

# 2. 將該檔案解開!文法與實際作法如下:
[root@www ~]# tar -jxv -f 打包檔.tar.bz2 待解開檔名
[root@www ~]# tar -jxv -f /root/etc.tar. bz2 etc/shadow
etc/shadow
[root@www ~]# ll etc
total 8
-r-------- 1 root root 1257 Sep 29 02:21 shadow  # 很有趣!此時只會解開一個文件而已!不過,重點是那個檔名!你要找到正確的檔名。
# 在本例中,你不能寫成 /etc/shadow !因為記錄在 etc.tar.bz2 內的檔名之故!

打包某目錄,但不含該目錄下的某些文件作法

假設我們想要打包/etc/ /root 這幾個重要的目錄,但卻不想要打包/root/etc* 開頭的文件, 因為該文件都是剛剛我們才創建的備份檔嘛!而且假設這個新的打包檔案要放置在/root 底下啊!),此時我們可以透過--exclude 的幫忙! 那個 exclude 就是不包含的意思!所以你可以這樣做:

[root@www ~]# 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] , 就能夠到第二行繼續輸入了。這個命令下達的方式我們會在第三章再仔細說明。 透過這個 --exclude="file" 的動作,我們可以將幾個特殊的檔案或目錄移除在打包之列, 讓打包的動作變的更簡單喔! ^_^

另外,在新版的 tar 指令中,鳥哥發現原本的『 --exclude file 』似乎無法實際運作了!使用 man tar 明明有看到這個選項的說, 但使用 info tar 才發現,選項功能已經變成了『 --exclude=file 』的模式!這個地方要特別留意呢!

只備份比某個時刻還要新的檔案

某些情況下你會想要備份新的檔案而已,並不想要備份舊檔案!此時 --newer-mtime 這個選項就粉重要啦! 其實有兩個選項啦,一個是‘ --newer ’另一個就是‘ --newer-mtime ’,這兩個選項有何不同? 我們在 第七章的 touch 介紹中談到三種不同的時間參數, 當使用 --newer 時,表示後續的日期包含‘ mtime 與 ctime ’,而 --newer-mtime 則僅是 mtime 而已! 這樣知道了吧! ^_^ 。那就讓我們來嘗試處理一下羅吧!

# 1. 先由find 找出比/etc/passwd 還要新的檔案
[root@www ~]# find /etc -newer /etc/passwd
....(過程省略)....
# 此時會顯示出比/etc/passwd 這個檔案的mtime 還要新的檔名,
# 這個結果在每部主機都不相同!您先自行查閱自己的主機即可,不會跟鳥哥一樣!

[root@www ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd

# 2. 好了,那麼使用tar 來進行打包吧!日期為上面看到的2008/09/29
[root@www ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2
> --newer-mtime="2008/09 /29" /etc/*
....(中間省略)....
/etc/smartd.conf    ....(中間省略)....
/etc/yum.repos.d/   tar: /etc/yum.repos.d/CentOS-Base.repo: file is unchanged; not dumped
# 最後行顯示的是『沒有被備份的』,亦即 not dumped 的意思!

# 3. 顯示出檔案即可
[root@www ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 |
> grep -v '/$'
# 透過這個指令可以呼叫出tar.bz2 內的結尾非/ 的檔名!就是我們要的!

現在你知道這個指令的好用了吧!甚至可以進行差異檔案的記錄與備份呢~ 這樣子的備份就會顯的更容易羅!你可以這樣想像,如果我在一個月前才進行過一次完整的資料備份, 那麼這個月想要備份時,當然可以僅備份上個月進行備份的那個時間點之後的升級的文件即可! 為什麼呢?因為原本的檔案已經有備份了嘛!幹嘛還要進行一次?只要備份新資料即可。這樣可以降低備份的容量啊!

基本名稱: tarfile, tarball ?

另外值得一提的是,tar 打包出來的文件有沒有進行壓縮所得到文件稱呼不同喔! 如果僅是打包而已,就是『 tar -cv -f file.tar 』而已,這個文件我們稱為 tarfile 。 如果還有進行壓縮的支持,例如『 tar -jcv -f file.tar.bz2 』時,我們就稱為 tarball (tar 球?)! 這只是一個基本的稱謂而已,不過很多書與網路都會用到這個 tarball 的名字! 所以得要跟您介紹介紹。

此外,tar 除了可以將資料打包成為文件之外,還能夠將文件打包到某些特別的裝置去,舉例來說, 磁帶機 (tape) 就是一個常見的例子。磁帶機由於是一次性讀取/寫入的裝置,因此我們不能夠使用類似 cp 等命令來複製的! 那如果想要將/home, /root, /etc 備份到磁帶機(/dev/st0) 時,就可以使用:‘tar -cv -f /dev/st0 /home /root /etc’,很簡單容易吧! 磁帶機用在備份 (尤其是企業應用) 是很常見的工作喔!

特殊應用:利用管線指令與資料流

在tar 的使用中,有一種方式最特殊,那就是透過標準輸入輸出的資料流重導向(standard input/standard output),以及管線指令(pipe ) 的方式,將待處理的檔案一邊打包一邊解壓縮到目標目錄去。 關於資料流重導向與管線指令更詳細的資料我們會在第十一章 bash 再跟大家介紹, 底下先來看一個例子吧!

# 1. 將/etc 整個目錄一邊打包一邊在/tmp 解開
[root@www ~]# cd /tmp
[root@www tmp]# tar -cvf - /etc | tar -xvf -
#這個動作有點像是cp -r /etc /tmp 啦~依舊是有其有用途的!
# 要注意的地方在於輸出檔變成 - 而輸入檔也變成 - ,又有一個 | 存在~
# 這分別代表 standard output, standard input 與管線命令啦!
# 簡單的想法中,你可以將 - 想成是在記憶體中的一個裝置(緩衝區)。
# 更詳細的資料流與管線指令,請翻到 bash 章節羅!

在上面的例子中,我們想要『將/etc 底下的資料直接copy 到目前所在的路徑,也就是/tmp 底下』,但是又覺得使用cp -r 有點麻煩,那麼就直接以這個打包的方式來打包,其中,命令裡面的- 就是表示那個被打包的文件啦! 由於我們不要讓中間文件存在,所以就以這一個方式來進行複製的行為啦!

 以上就是筆記004 Linux常用的tar指令的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板