合理处理移动的 Rsync

合理处理移动的 Rsync

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

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

我发现一致应该能够做到这一点,但在实践中似乎不起作用。我测试过一致通过同步两个本地目录,每个目录中都有一个大文件,它仍然检测到我的移动是删除+创建,并且实际上比同步

此外,如果我没记错的话一致几个月前的源代码中,它尝试执行诸如 sha sum 之类的操作,而我不希望我的理想解决方案进行 sha sum,这对于大文件/目录来说太慢了。我想要一些能注意到这样的事情的东西:

“该文件的最后一个源对应项似乎已被删除,并且源目录树中的其他位置有一个新文件,该文件具有相同的 mdate、大小和索引节点号,因此我将假设这是一个移动,并且相应地移动其目标副本,而不是执行删除+复制。”

能够快速同步这些机器对我来说很重要。

有什么建议么?

答案1

你应该看看rdiff 备份rsync在底层执行,但具有您需要的额外智能(并且它使增量备份能够回滚,但您可以配置将其关闭)。

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

答案2

Unison 可以做你想做的事,但仅限于远程同步。尝试用作ssh://localhost/path/to/dir根之一。

Unison 确实根据文件内容做出决定,但它不跟踪 inode 编号。

答案3

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

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

# 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。但我建议您在生产中使用此方法之前进行大量测试。

答案4

问题很旧,但相关。

这是您正在寻找的工具: rsync 助手

这会同步 3 种类型的更改:

  1. 文件修改时间戳的更改(如果您使用 exiftool 批量更改照片的时间戳)
  2. 重命名文件/目录
  3. 将文件从一个目录移动到另一个目录

它被设计为运行rsync 已运行。

免责声明:我是上述工具的作者。

相关内容