明智地处理移动的Rsync


10

我已经成功地使用rsync在笔记本电脑和上网本之间同步主目录(两者都在Linux上使用ext4)。我唯一的问题是,我不时地希望完全重组某些目录,而rsync将其视为删除和创建新文件,这使其非常缓慢且效率低下。

有人知道一个很好的软件可以很好地处理文件移动吗?

我发现统一应该能够做到这一点,但实际上似乎并不起作用。我通过同步两个本地目录(每个目录中都有一个大文件)来测试统一,它仍然将我的移动检测为删除+创建,实际上比rsync还要慢。

而且,如果我几个月前看过unison的源代码时没记错的话,它试图做类似求和的事情,而我不希望我的理想解决方案做求和,这对于大型应用来说太慢了文件/目录。我想要一些可以注意到的东西:

“该文件的最后一个源副本似乎已被删除,并且源目录树中的其他位置有一个新文件,该文件的mdate,大小和inode编号相同,因此,我仅假设这是一个步骤,相应地移动其目标副本,而不是执行Delete + copy。”

对我而言,重要的是我能够快速同步这些机器。

有什么建议?

Answers:


6

您应该看一下它下面的rdiff-backuprsync,但是它具有所需的附加智能(它使增量备份能够回滚,但是您可以配置将其关闭)。

最新版本较旧(2009),但这是稳定的标志。


2
有人尝试过吗?
薄雾

3

Unison可以满足您的要求,但仅用于远程同步。尝试将其ssh://localhost/path/to/dir用作根源之一。

Unison会根据文件内容做出决定,而不会跟踪inode编号。


1

如果源目录和目标目录上的文件系统支持硬链接,则可以使用rsync处理移动和重命名的文件。这个想法是让rsync在实际传输之前重建硬链接。您可以在这里找到很好的解释

我们最终得到了一个简单的解决方案,该解决方案在source / target目录中创建了一个包含硬链接的隐藏树,基本脚本可能如下所示:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

我在GitHub上有一个示例脚本。但我建议您在生产中使用此方法之前,请进行大量测试。


0

如果要在多台计算机之间同步文件,则可能只想使用集中式版本控制系统,例如Subversion(或FSVS,它使用SVN作为后端)。令人高兴的是,您/ home(添加到版本控制中)中的所有内容都将被版本化,并且可以轻松地同步到其他计算机或回滚。


0

lsyncd还以rsync + ssh的行为处理已移动的文件,尽管有些错误(我发现大约15%的移动被作为删除/复制处理,但仍未查明原因)。在大多数情况下,它都能正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.