rsync 確實不能優雅地處理“文件重命名”嗎?
在使用備份工具
duplicity
時,我注意到如果我在源上重命名文件,數據將再次通過網路重新發送到目的地,這有點令人難過。由於duplicity
使用librsync
內部,我決定看看rsync
.這個ArchWiki 頁面指出:
處理重命名
檢測到移動/重命名的文件並且不會儲存或傳輸兩次。它通常意味著計算文件或其塊的校驗和。缺少此功能的應用程序可以通過與僅同步重命名的AUR結合使用來補充。
hsync
rsync:處理重命名:否
這是否真的意味著,在使用時
rsync
,如果我在源電腦上重命名/test/10GBfile
為**,就無法防止 10 GB 通過網路重新傳輸到目標?**/test/10GBfile_newname
鑑於 的長期流行
rsync
,有沒有更好的處理方式?
沒有
rsync
跟踪重命名的機制,因為它在執行時不保持狀態。如果您在源電腦上重命名/test/10GBfile
為/test/10GBfile_newname
,則預設情況下rsync
只能看到10GBfile
已刪除和10GBfile_newname
已創建的。
--fuzzy
參數 (-y
) 可以幫助辨識目標上的10GBfile
潛在數據源10GBfile_newname
,從而以文件副本為代價避免網路副本。但是,它(大多數情況下)只能考慮同一目錄中的文件匹配,因此儘管您的範例會匹配,但重命名/test/10GBfile
to/test/otherdir/10GBfile_newname
不會。另請注意,文件 (
man rsync
) 建議如果要使用--delete
,則應改為使用--delay-updates
or--delete-after
,以便--fuzzy
在使用之前不會刪除潛在的匹配項。例子
# Prepare an uncompressible 100MB file mkdir -p /tmp/test dd bs=1M count=100 iflag=fullblock if=/dev/urandom >/tmp/test/file1 # Normal first-time copy rsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test # Skip copy because unchanged rsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test # Rename file (per your example) mv /tmp/test/file1 /tmp/test/file2 # Fast copy because fuzzy match rsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test
添加另外兩個
-v
標誌(即rsync -avvv …
)以查看正在發生的逐塊詳細資訊。