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 同步文件重復拷貝問題
- 使用命令行啟動 VirtualBox 虛擬機6,464 人瀏覽過
- 什么是交互式登錄 Shell17,067 人瀏覽過
- Grub 加載系統的三個階段4,436 人瀏覽過
- Sed and awk 筆記之 sed 篇:高級命令(二)7,607 人瀏覽過
- Sed and awk 筆記之 awk 篇:快速了解 Awk(二)9,502 人瀏覽過
- iftop: Linux 下的流量監控工具