2009年9月22日 星期二

FreeBSD--指令 tar

FreeBSD--指令 tar

tar (tape archive) 原本是設計用來將文件打包到磁帶中的,我們也可以將檔案或是目錄打包成一個單一的檔案,必要時再用同一個程式來將資料全部還原或是只解開部份的資料,正因為它可以備份檔案或目錄,深受大家的愛用。




常用參數:



指定動作 :

-c create,新增一個備份檔

-t list,顯示備份檔中的檔案清單

-x extract,解開備份檔中的檔案



指定檔案:

-f file,讀/寫指定的檔案



壓縮方式:

-z gzip,備份的東西要用 gzip 壓縮/解壓縮

-y bzip,備份的東西要用 bzip 壓縮/解壓縮,也可以用 -j



其它:

-p permissions,保留原來的權限

-v verbose,備份的內容要顯示在畫面

-C (大寫 C),cd 先切換目錄

由於 tar 的功能非常的多,指令可用的選項令人眼花瞭亂,下面只示範最常用的,有興趣再自己用 man tar 好好的研究囉!
 
 
1-1 以 tar 打包要備份的資料
 
如果沒有什麼特殊需求,利用 tar 備份檔案只要用到 -c (新增) ,-p (保留權限設定),-f (指定檔名),頂多再加個 -v 看一下打包的過程。




例如:



tar -cpvf /home/backup/etc.tar /etc



上例將 /etc 目錄中所有的檔案打包到 /home/backup/etc.tar 中。



也可以同時備份多個目錄,將要打包的清單(以空白分隔)接在最後面即可。下面的例子將 /etc , /usr/local/etc 打包在 etc.tar 中:



tar -cpvf /home/backup/etc.tar /etc /usr/local/etc



我們也可以使用:



tar -czpvf /home/backup/etc.tgz /etc



和前面的例子比較,多了個參數 z ,也就是將 tar 打包完的檔案再利用 gzip 壓縮,所以新產生有經過壓縮處理的備份檔我們也將檔名命名為 etc.tgz (.tgz 結尾),也有人用 .tar.gz ,端看個人習慣。



咦~好奇的人可能會想到 FreeBSD 的 packages 檔名好像叫 *.tgz 或 *.tbz,和 tar , gzip , bzip 有沒有關啊?有興趣可以找個 FreeBSD 的 package ,用 tar 來打開包裝看看哦!!



另外,比較一下這兩個同樣是備份 /usr/local/etc 的指令有何不同?



tar -czvf /home/backup/local.etc.1.tgz /usr/local/etc



tar -czvf /home/backup/local.etc.2.tgz -C /usr/local etc



由於 tar 預設在備份時會儲存檔案的路徑 (但是自動去掉開頭的第一個斜線) ,也就是 /usr/local/etc/rc.d 在 local.etc.1.tgz 中會變成 usr/local/etc/rc.d,如果我們連 usr/local 都不想要,打包時可以利用 -C (大寫字母) 這個參數來控制路徑的保留層次,像前面第二個例子加了 -C /usr/local ,tar 會先切換至 /usr/local 目錄才備份 etc,所以在 local.etc.2.tgz 中 /usr/local/etc/rc.d 變成 etc/rc.d 儲存起來。
 
1-2 查看 tar 打包的檔案
 
要查看以 tar 打包的檔案只要利用 -t 這個動作參數即可。




例如:



tar -tvf /home/backup/etc.tar



上例會將 /home/backup/etc.tar 中的檔案清單顯示出來。



如果備份時有用 gzip 壓縮過則可以加上 -z :



tar -tzvf /home/backup/etc.tgz



如果備份時用 bzip 壓縮過則加上 -y 或是 -j:



tar -tyvf /home/backup/etc.tbz



1-3 解開 tar 打包的檔案



要解開 tar 封裝的檔案是利用 -x 這個動作參數,再搭配 -z , -y (-j) 解壓縮。如果想保留原來的權限設定則要記得使用 -p,至於要不要使用 -C (大寫字母) 則要看當初在打包時有沒有使用及自己想要放置的路徑而定,最容易犯的毛病大多是解錯路徑,所以在使用 -x 解開時一定要記得先用 -t 查看一下當初是怎麼打包的,最保險的方法是先解到一個暫存的地方,再將需要的檔案複製/搬移到目的地。



將 /home/backup/etc.tgz 中的東西在目前所在的目錄解開:



tar -xzvf /home/backup/etc.tgz



將 /home/backup/etc.tgz 中的東西在 /home 中解開:



tar -xzvf /home/backup/etc.tgz -C /home



將 /home/backup/etc.tgz 中的東西在 /home 中解開,並保留原始的權限:



tar -xzpvf /home/backup/etc.tgz -C /home



1-4 只解開 tar 打包的部份檔案



只解出 /home/backup/etc.tgz 中的 etc/group , etc/master.passwd 兩個檔案:



tar -xzvf /home/backup/etc.tgz etc/group etc/master.passwd



將 /home/backup/etc.tgz 中凡是叫 etc/rc* 通通解開,其它的不要:



tar -xzvf /home/backup/etc.tgz 'etc/rc*'



將 /home/backup/etc.tgz 中的檔案解開,但是 rc.d 目錄中的東西不要:



tar -xzvf /home/backup/etc.tgz --exclude='rc.d/*'



以上提到的方法也可以應用在打包時 (-c) 及查看清單時 (-t) 。







1-5 利用 tar 直接複製整個目錄到另一個目錄中



利用 tar 和 pipe 的技巧,可以做整個目錄直接複製,不過這個方法並不保證完整哦,畢竟它的方式不若 dump + restore 完備。



假設我想把 /usr 中所有的東西複製到 /mnt/usr 中,就執行底下的指令:



tar cf - /usr
(cd /mnt ; tar xvfBp -)

沒有留言:

張貼留言