GNU cpio
tar 和cpio 類似,從備份來看二者基本等效。都能將文件存到磁帶并取出文件。都能使用幾乎所有介質,因為核心設備驅動處理低級設備操作,對用戶級程序看來所有設備都差不多。有些unix的軟件包就是cpio壓的。
項目地址:http://www.gnu.org/software/cpio/
cpio 用法舉例:
帶目錄結構拷貝指定文件到指定目錄:
find /backup/svr -name "63201.rpt" |cpio -pdl /print
將帶目錄結構的指定文件拷貝到一個指定的文件:
find . -name "63201.rpt" |cpio -ov 63201.cpio
從文件中恢復:
cpio -ivd 63201.cpio
為什么cpio比tar好?有這樣幾個原因。
1、cpio會保留硬連接(hard link),備份的時候這個很重要
2、cpio沒有文件名長度的限制。確實,guntar在這一點上做過改進,允許使用長文件名(實際上是創建了一個臨時文件用來保存實際的文件名),但是在非gnu的tar工具上仍然存在這個問題。
3、默認情況下,cpio保留時間戳
4、在編寫腳本的時候,cpio可以更好的控制要操作哪些文件。因為cpio需要顯式的制定要操作的文件列表,例如下面哪個更加容易理解?
find . -type f -name '*.sh' -print | cpio -o | gzip >sh.cpio.gz
這兒有一個需要特別注意的:對于包含大量文件的列表,不能將find放在反引號(`)內,因為命令行長度會超出長度限制,因此必須使用中間文件。find和tar分開跑很明顯會使得速度減慢。
下面這個例子更加復雜,將一部分文件打包到一個文件中,其它部分打包到另外一個文件中:
- find . -depth -print >/tmp/files
- egrep '\.sh$' /tmp/files | cpio -o | gzip >with.cpio.gz
- egrep -v '\.sh$' /tmp/files | cpio -o | gzip >without.cpio.gz
同樣的,find和tar分開跑會使得速度變慢。創建多個中間文件也搞出了更多的混亂。gnutar稍好些,但是它的命令行參數卻是不兼容的。
5、如果有很多文件需要通過網絡在兩臺機器之間復制,則可以并行的跑幾個cpio。例如:
- find . -depth -print >/tmp/files
- split /tmp/files
- for F in /tmp/files?? ; do
- cat $F | cpio -o | ssh destination "cd /target && cpio -idum" &
- done