rsync 同步文件重復拷貝問題


rsync 是同步文件的利器,一般用於多個機器之間的文件同步與備份,同時也支持在本地的不同目錄之間互相同步文件。在這種場景下,rsync 遠比 cp 命令更加合適,它只會同步需要更新的文件,默認情況下,rsync 通過比較文件的最后修改時間(mtime)和文件的大小(size)來確認哪些文件需要被同步過去。

最近剛好有一個需求,需要將文件從一個目錄同步到另外一個目錄去,我就首先試了下下面的命令:

# mkdir src dest
# echo hello > src/one.txt
# rsync --stats src/1.txt dest

這里加上 --stats 的目的是為了顯示文件傳輸的詳細信息。執行完成后文件已經同步到目標目錄,非常簡單,但是如果再執行一次,我們會非常尷尬地發現文件被再次同步過去:

# rsync --stats src/one.txt dest

Number of files: 1
Number of files transferred: 1
Total file size: 6 bytes
Total transferred file size: 6 bytes
Literal data: 6 bytes
Matched data: 0 bytes
File list size: 21
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 77
Total bytes received: 31

sent 77 bytes  received 31 bytes  216.00 bytes/sec
total size is 6  speedup is 0.06

這里的問題讓我抓狂很久,百思不得其解。但是如果我們運行時加上 -a 參數,文件就不會重復同步,下面是運行結果:

# rsync -a --stats src/one.txt dest

Number of files: 1
Number of files transferred: 0

翻了下幫助,找到 -a 選項的說明:

# rsync --help | grep -w -- -a
 -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)

使用這個選項后,會開啟 archive mode,這時同步的時候會保留文件的屬性,例如權限、用戶及組、時間等等。然后,我們回憶下 rsync 如何是比較文件,大概可以猜出問題應該出在時間這一個屬性上,准確地說是最后修改時間,也即所謂的 mtime。

那我們接下來,通過實際例子來確認下我們的猜想:

# rm src/one.txt 
# rsync src/one.txt dest
# stat -c %y src/one.txt dest/one.txt 
2013-10-15 11:28:15.000000000 +0800
2013-10-15 11:28:17.000000000 +0800

果然,不帶選項同步時源和目標文件的 mtime 是不一樣的,這就導致下次 rsync 的時候,仍然誤以為文件需要同步。接下來,我們改變下 dest/one.txt 的 mtime,然后再執行一次:

# touch -r src/one.txt dest/one.txt
# rsync --stats src/one.txt dest

Number of files: 1
Number of files transferred: 0

這下 rsync 不會再同步 one.txt 了。當然,還有其它的選項也能夠有同樣的效果,比如 --update 或者 --size-only,都可以嘗試下。

當然大多數情況下,還是建議以下幾個選項一起使用:

# rsync -avzS --partial src dest

轉載請注明轉自: 團子的小窩 , 本文固定鏈接: rsync 同步文件重復拷貝問題

rsync 同步

相關的文章

http://kodango.com/rsync-always-copy-files


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM