Linux打包命令 - tar

        上一篇文章談到的命令大多僅能針對單一文件來進行壓縮,儘管 gzip 與 bzip2 也能夠針對文件夾來進行壓縮, 只是。這兩個命令對文件夾的壓縮指的是『將文件夾內的所有文件 "分別" 進行壓縮』的動做!php

而不像在 Windows 的系統。可使用相似 WinRAR 這一類的壓縮軟件來將好多數據『包成一個文件』的樣式。

        這樣的將多個文件或文件夾包成一個大文件的命令功能,咱們可以稱呼他是一種『打包命令』啦! 那 Linux 有沒有這樣的打包命令呢?是有的!那就是鼎鼎大名的 tar 這個玩意兒了!linux

tar 可以將多個文件夾或文件打包成一個大文件,同一時候還可以透過 gzip/bzip2 的支持,將該文件同一時候進行壓縮! 更有趣的是。由於 tar 的使用太普遍了。眼下 Windows 的 WinRAR 也支持 .tar.gz 檔名的解壓縮呢。
安全


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 欲解壓縮的文件夾
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


查閱 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 所察看到的檔名) 那就是解壓縮後的實際檔名。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 選項。因此僅有檔名而已。沒有具體屬性/權限等參數。


將備份的數據解壓縮,並考慮特定文件夾的解壓縮動做 (-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
....(後面省略)....


僅解開單一文件的方法

# 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 是『擷取』keyword的功能。咱們會在第三篇說明! # 這裏您先有個概念就能夠!

那個管線 | 配合 grep 可以擷取keyword的意思! # 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 內的檔名之故!



打包某文件夾,但不含該文件夾下的某些文件之做法

[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] , 就行到第二行繼續輸入了。



僅備份比某個時刻還要新的文件

# 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 的名稱! 

相關文章
相關標籤/搜索