rsync 确实不能优雅地处理“文件重命名”吗?

Bas*_*asj 5 storage backup rsync rdiff

在使用备份工具时duplicity,我注意到如果我重命名源上的文件,数据将通过网络再次重新发送到目的地,这有点令人难过。由于内部duplicity使用librsync,我决定看看rsync.

\n

这个ArchWiki 页面指出:

\n
\n

处理重命名
\n检测到移动/重命名的文件,并且不会存储或传输两次。\xc2\xa0\n它\xc2\xa0通常意味着计算文件或其块的校验和。\xc2\xa0\n可以补充缺少此功能的应用程序通过与AUR组合,它仅同步重命名。hsync

\n
\n
\n

rsync:处理重命名:否

\n
\n

这是否真的意味着,在使用 时rsync,如果我在源计算机上重命名为 ,则无法阻止 10 GB 通过网络重新传输到目的地/test/10GBfile/test/10GBfile_newname

\n

鉴于 的长期流行rsync,是否有更好的处理方式?

\n

roa*_*ima 7

没有rsync跟踪重命名的机制,因为它除了运行时之外不维护状态。如果在源计算机上重命名/test/10GBfile为,则默认情况下只能看到已删除的和已创建的。/test/10GBfile_newnamersync10GBfile10GBfile_newname

\n

参数--fuzzy( -y) 可以帮助识别目标上的10GBfile潜在数据源10GBfile_newname,从而避免以文件副本为代价的网络副本。但是,它(大多数情况下)只能考虑同一目录中文件的匹配,因此尽管您的示例会匹配,但重命名/test/10GBfileto/test/otherdir/10GBfile_newname不会匹配。

\n

另请注意,文档 ( man rsync) 建议,如果您想使用,--delete则应使用--delay-updates或 ,--delete-after以便--fuzzy在使用之前不会删除 的潜在匹配项。

\n

例子

\n
# Prepare an uncompressible 100MB file\nmkdir -p /tmp/test\ndd bs=1M count=100 iflag=fullblock if=/dev/urandom >/tmp/test/file1\n\n# Normal first-time copy\nrsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test\n\n# Skip copy because unchanged\nrsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test\n\n# Rename file (per your example)\nmv /tmp/test/file1 /tmp/test/file2\n\n# Fast copy because fuzzy match\nrsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test\n
Run Code Online (Sandbox Code Playgroud)\n

添加另外两个-v标志(即rsync -avvv \xe2\x80\xa6)以查看正在发生的情况的逐块详细信息。

\n


lak*_*tak 5

--fuzzy已经得到了回答,但还有另一个涉及硬链接的有趣黑客。

第一次转账后

$ rsync -avHP --delete-after ~/family/Photos remotebox:backups
Run Code Online (Sandbox Code Playgroud)

您创建一个硬链接工作目录:

$ cd ~/family
$ cp -rlp Photos Photos-work
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

$ rsync -avHP --delete-after --no-inc-recursive ~/family/Photos ~/family/Photos-work remotebox:backups
Run Code Online (Sandbox Code Playgroud)

将新结构传输到远程。

这里解释了为什么以及如何工作:

https://lincolnloop.com/blog/detecting-file-moves-renames-rsync/