台灣最大程式設計社群網站
線上人數
755
 
會員總數:245216
討論主題:189089
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> Linux的tar命令詳解
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Linux的tar命令詳解
價值 : 0 QP  點閱數:967 回應數:0

樓主

Vale
門外漢
0 3
330 5
發送站內信

tar是Linux環境下最常用的備份壓縮工具之一。tar(tap archive)原意為操作磁帶文件,但基於Linux的文件操作機制,同樣也可適用於普通的磁盤文件。tar可用於建立、還原、查看、管理文件,也可方便的追加新文件到備份文件中,或僅更新部分的備份文件,以及解壓、刪除指定的文件。熟悉其常用參數,能方便日常的系統管理工作。

一、版本
還是那句,不同的操作系統,tar的命令參數是有點區別的:


引用
# tar --version
tar (GNU tar) 1.14

二、簡單操作
命令格式:


tar [options] [tarfile] [other-files]
tar--long-option -function-options files

tar可使用的參數非常多,先列舉幾個最常用的參數:


引用
-t, --list
列出歸檔文件內容目錄
-x, --extract, --get
從歸檔文件中解析文件
-c, --create
創建新的歸檔文件
上面三個參數,不能同時存在,僅能使用其中一個,即t/x/c
-f file, --file=file
指定備份文件,或設備,例如磁帶機/dev/st0
-v, --verbose
顯示命令的執行過程
-Z, --compress, --uncompress
使用compress命令處理備份文件
-z, --gzip, --gunzip, --ungzip
使用gzip命令處理備份文件
-j, --I, --bzip
使用bzip2命令處理備份文件
-z和-j都是在備份文件打包後才進行壓縮的操作的,並且,該操作會影響其他的參數,後面會再提到
-C directory, --directory=directory
先進入指定的目錄,再釋放

簡單使用:
把/etc目錄中所有的文件打包為etc.tar文件


tar -cvf /tmp/etc.tar /etc

把/etc目錄中所有的文件打包並使用gzip壓縮為etc.tar.gz文件


tar -zcvf /tmp/etc.tar.gz /etc

把/etc目錄中所有的文件打包並使用bzip2壓縮為etc.tar.bz2文件
這裡的,tar.gz或tar.bz2都是慣例,為方便標識的,例如:tgz等,並不是特定條件,但建議遵循慣例


tar -jcvf /tmp/etc.tar.bz2 /etc

查看備份包中的內容,若為已經壓縮的文件,需加上-z或者-j參數


tar -ztvf /tmp/etc.tar.gz

默認情況下,tar打包時都是使用相對路徑的,所以,釋放時,需要先進入目錄目錄,然後再解壓
同樣的,根據使用的壓縮方式,應加上-z或者-j參數


cd /tmp && tar -zxvf /tmp/etc.tar.gz

這是另一種寫法,結果和上面的相同,其會先進入/tmp目錄,然後再釋放包的


tar -zxvf /tmp/etc.tar.gz -C /tmp

釋放單個etc/passwd文件,正如前面提到的,tar包中的是相對路徑,所以不能使用「/etc/passwd」
而且,這裡不能使用-C參數,釋放文件是當前路徑的相對路徑,並帶目錄釋放


tar -zxvf /tmp/etc.tar.gz etc/passwd

tar還可以支持很多額外的參數,方便我們在備份和釋放的時候進行控制

三、更多參數
以三大常見操作為序說明。
1、備份


引用
-d, --diff, --compare
找出歸檔文件和文件系統的不同之處
-r, --append
將文件附加到歸檔文件之後
-u, --update
只附加比歸檔中新的文件
-A, --catenate
將 tar 文件附加到歸檔文件之後
--concatenate
與 -A 相同
--delete
從歸檔文件中刪除 (不能在磁帶上!)
-N date, --newer=date, --after-date=date
只將比指定日期更新的文件保存到備份文件
--exclude=pattern
排除符合查找模式的文件
-P, --absolute-names
備份文件中的文件名使用絕對路徑,而不移除文件名前的「/」,默認是相對路徑的
-l, --one-file-system
複製文件或目錄存放的文件系統必須和tar命令當前執行的文件系統相同,否則不執行;也就是講,不處理其他分區的文件。(可忽略mount掛載分區的問題)
--mode=permissions
備份時,把加入備份文件中的文件屬性修改為指定的屬性,格式和chmod命令接受的格式相同
--group=group
備份時,把加入備份文件中的文件所屬組設定成指定的組
--owner=owner
備份時,把把加入備份文件中的文件所有者設定成指定的用戶
--numeric-owner
以UID和GID代替用戶名和組名
--recursion
遞歸模式(默認)
--no-recursion
不進行遞歸處理,即不把指定目錄下的所有文件和文件夾都備份
--newer-mtime=date
Add only files whose contents have changed since date to the archive.
僅增加指定日期後修改過內容的文件到備份文件中
--anchored
排除時,排除匹配式中匹配整個文件路徑(默認)
--no-anchored
排除時,排除匹配式中可匹配「/」後的路徑
--ignore-case
排除時,排除匹配式中忽略大小寫
--no-ignore-case
排除時,排除匹配式中大小寫敏感(默認)
--wildcards
排除匹配式支持通配符(默認)
--no-wildcards
排除匹配式不支持通配符
--wildcards-match-slash
排除匹配式的通配符匹配「/」(默認)
--no-wildcards-match-slash
排除匹配式的通配符不匹配「/」
-X file, --exclude-from file
指定樣式文件,供程序執行時剔除符合條件的文件
--remove-files
刪除已經加入到備份文件中的文件

舉例:
創建當前目錄的全備份到backup.tar文件
(使用find的原因是,這樣可以打包所有隱含文件或不符合命令規範的文件和目錄)


tar cvf - `find . -print` > backup.tar

比2005年6月1日新的文件才會備份


tar -N '2005/06/01' -zcvf home.tar.gz /home

除/home/dmtsai目錄外,/home和/etc目錄的所有東西都打包


tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

刪除etc.tar文件中的etc/pbm2ppa.conf文件


tar --delete etc/pbm2ppa.conf -vf etc.tar

把tmp.tar文件附加到etc.tar後面


tar -A tmp.tar -vf etc.tar

根據-T參數後的樣式文件list.txt,打包/etc中指定的文件,同樣的,list.tx默認也是相對路徑的


find . -name "*.d" -o -name "*.conf" > list.txt
tar -T list.txt -czvf etc.tar.gz /etc

通過管道,使用一條命令實現上面相同的功能


find . -name "*.d" -o -name "*.conf" | tar -czvf etc.tar.gz -T -


※值得注意幾個地方


引用
1)-f後面必須緊跟備份文件,xxx.tar或者xxx.tar.gz
2)使用--delete、-u、-r、-A的時候,後面跟的備份文件都必須為未壓縮的,若備份文件已經壓縮,需要使用gunzip先解壓,操作完後再gzip;
也就是說,不能對tar.gz、tar.bz2等文件直接操作的;
3)備份打包時,默認為相對路徑;而排除匹配式默認也是全路徑匹配的
所以,在打包時,會提示:「tar: Removing leading `/' from member names」
除非你使用-P參數或特定的參數指定

2、釋放

引用
-k, --keep-old-files
還原備份文件時,不覆蓋已存在的文件
-m, --modification-time, --touch
還原文件時,不變更文件的更改時間
-p, --same-permissions
解析許可權限信息,即保留備份文件中的權限信息
-s, --same-order, --preserve-order
以與備份文件相同的順序還原文件
--preserve
等於同時設置-p和-s
--no-same-permissions
不解析許可權限信息,這是普通用戶的默認設置,僅對影響管理員的操作有影響
--no-same-owner
不使用備份文件中的所有者信息,而以您自己的身份解析文件
--same-owner
使用相同的文件所有者還原文件
--overwrite
覆蓋已經存在的文件和目錄
--overwrite-dir
覆蓋已經存在的目錄
--recursive-unlink
釋放前,先刪除整個目錄下所有文件的連接

舉例:
釋放文件時,設置為備份文件中的相同所有者(僅對管理員而言)

tar --same-owner -xzvf etc.tar.gz

通過管道,把/etc目錄用tar整個「拷貝」到/backup/etc,而不用建立任何臨時文件
因為根本不需要生成備份包文件,所以這裡不需要-z參數

tar cvf - /etc | tar xvf - -C /backup/etc

這裡同上面的原理是一樣的,只不過通過ssh直接「拷貝」到遠端機器上而已
配合ssh密鑰匹配,可實現不用人工干預的備份工作

tar cvf - /etc | (ssh root@192.168.228.244 'tar xvf - -C /backup/etc')


3、操作磁帶設備
部分參數只適用於磁帶設備,不適用於常規的磁盤文件。

引用
-K file, --starting-file=file
從指定的文件開始還原(按順序)
-L length, --tape-length=length
設置磁帶的容量,單位為1024字節(bytes)
-M, --multivolume
在建立、還原備份文件或列出其中內容時,採用多卷模式(不能對文件操作)
-V name, --label=name
建立使用指定卷標的備份文件
-W, --verify
寫入備份文件後,校驗文件是否正常
-F script, --info-script=script, --new-volume-script=script
更換磁帶時執行指定的腳本文件,必須與參數-M同時使用

舉例:
把/bin、/usr/bin目錄都打包到st0磁帶設備中

tar cvf /dev/st0 /bin /usr/bin

把old.dmp文件追加到st0磁帶中(使用cvf,會刪除原來的文件的)
Linux下使用磁帶機的簡單方法,可以見這裡:點擊

tar rvf /dev/st0 old.dmp


4、其他
還有一些控制參數這裡不詳細討論了,請自行測試。
但提醒一句,-T參數比較重要哦。

引用
--null
-T從null設備讀取文件名,覆蓋-C的設置
-o, --old-archive, --portability
將數據寫入備份文件時使用V7格式
--posix
將數據寫入備份文件時使用POSIX格式
-G, --incremental
處理舊GNU格式的增量備份
--rsh-command=command
不使用rsh命令連接遠程主機,而使用指定的命令進行
--suffix=suffix
指定要刪除文件前備份文件,該備份文件使用的後綴,默認是「~」
--totals
創建備份文件時,列出已建立的備份文件的大小
tar --totals -cvf tmp.tar tmp/
-R, --block-number
在輸出信息時,一同block number信息
-S, --sparse
若文件中有大量連續0字節時,將該文件保存成稀疏文件
-T file, --files-from=file
指定樣式文件,文件內容為一個或多個條件樣式,供程序還原或創建符合指定條件的文件
--use-compress-program=program
使用指定的壓縮程序對備份文件壓縮或解壓
--volno-file=FILE
使用或更新FILE文件中指定的卷號碼
-w, --interactive, --confirmation
當遇到問題時,要求用戶先確認
-B, --read-full-records
讀取數據是重設扇區大小,僅適用於BSD 4.2的管道操作
-O, --to-stdout
把從備份文件裡還原的文件輸出到標準輸出設備
--version
版本信息
--help
幫助信息

搜尋相關Tags的文章: [ tar ] ,
本篇文章發表於2008-01-28 14:59
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.