【问题标题】:How do I synchronize in both directions?如何双向同步?
【发布时间】:2010-12-08 19:24:20
【问题描述】:

我想使用 rsync 在两个方向上同步两个目录。

我指的是古典意义上的同步 (不是它在 rsync 手册中的含义):
我想更新目录双向, 取决于其中哪个较新

这可以通过 rsync 完成吗(最好以 Linux 方式)
如果没有,还有哪些其他解决方案?

【问题讨论】:

标签: rsync


【解决方案1】:

只需运行两次,使用“更新”模式(-u 或 --update 标志)加上 -t(复制文件修改时间)、-r(用于递归文件夹)和 -v(用于查看详细输出)它在做什么):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

这不会处理删除,但我不确定只有定期同步才能解决这个问题。

【讨论】:

  • 由于问题是关于 rsync,我将这个答案标记为正确。
  • 但是您还询问了其他解决方案,Unison 做得更好,否则我永远不会提到其他工具。据我了解,您可能有特定情况支持使用 rsync。
  • Sheesh,你得到了 6 票,你还在抱怨吗? Unison 是一个非常有趣的解决方案,我很高兴你提到了它。 :)
  • 好吧,我不是在抱怨,而是在解释。只是为了检查我没有遗漏什么(不是以英语为母语的人)。
  • MaD70 - 没问题...我只是在开玩笑。 :)
【解决方案2】:

你知道Unison File Synchronizer吗?

Unison 是一个文件同步工具 适用于 Unix 和 Windows。它允许两个 文件集合的副本和 要存储在不同的目录 主机(或相同的不同磁盘 主机),单独修改,然后 通过传播最新的 每个副本对另一个副本的更改。 ...

另请注意,它对失败具有弹性:

Unison 能够抵御失败。它是 小心离开复制品及其 在合理的范围内拥有私人结构 始终状态,即使在 异常终止或通信失败。

【讨论】:

  • +1。 Unison 是最好的方法。双 rsync 很难正确处理,根本不处理删除。
  • 是的,Unison 具有故障恢复能力。我正在更新我的答案以强调这一点。
  • 没听说过Unison。你有责任让我今天在家重做备份脚本。
  • 我很高兴我的回答如此有用(这表明基于良好理论基础的工具如何实用)。
  • 这是一个short tutorial 给 linuxjournal 上的 Unison。
【解决方案3】:

您需要运行两次rsync,我建议使用-au 运行它:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(用于存档)是-rlptgoD 的快捷方式:

  • -r递归到子目录
  • -l 同时同步符号链接
  • -p 也同步文件权限
  • -t 同时同步文件修改时间
  • -g 同时同步文件组
  • -o 同时同步文件所有者
  • -D 同时同步特殊(非常规/元)文件

基本上,只要您想使用 rsync 创建相同的一对一副本,您应该始终使用 -a,因为这是大多数用户在谈论“同步时所期望的”。这里的其他答案似乎忽略了有时文件的内容保持不变,但其所有者可能已更改或其访问权限可能已更改,在这种情况下rsync 不会同步文件,这可能是致命的。

但是您还需要-u,因为它告诉rsync 完全不理会任何文件/文件夹,以防它已经存在于目的地并且具有较新的最后修改日期。如果没有-u rsync 将同步regardless if a file/folder is newer or not

请注意,此解决方案无法处理已删除的文件。考虑以下情况,处理删除并不容易:文件已在源删除,现在rsync 如何知道该文件是否曾经存在并已被删除(在这种情况下,它也必须在目标删除) 或者它是否从未存在于源中(在这种情况下,它必须从目标复制)。这两种情况看起来与rsync 相同,因此它不知道如何正确反应。反过来同步也无济于事,因为这会导致相同的情况:文件存在于源中,但不存在于目的地。为什么?它从未在目的地存在或已被删除?这两种情况看起来都与rsync 相同。

能够可靠地同步已删除文件的同步工具通常会管理有关所有过去同步操作的同步日志。如果该日志显示曾经有一个文件并且已经同步但现在它丢失了,那么很明显它已被删除。如果根据日志从未有过这样的文件,则必须对其进行同步。通过使用时间戳存储所有日志条目,甚至有可能一个已删除的文件返回并被多次删除,但同步工具将始终知道该做什么并且结果始终是正确的。 rsync没有这样的日志,它只依赖于操作双方当前的文件状态。

但是,您可以使用rsync 和一点 POSIX shell 脚本编写自己的同步命令,该脚本已经非常接近如上所述的同步工具。因为我自己需要这样一个工具,here is an answer on Stackoverflow 可以指导您创建这样的脚本。

【讨论】:

  • 漂亮。
【解决方案4】:

感谢 jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

这将导致在第一次同步结束后立即发生第二次同步。如果目录结构很大,这将节省时间,因为不需要坐在电脑前。如果结构很大,去掉冗长和进度的东西

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a

【讨论】:

  • 只是想知道我是否应该添加 -t 来复制文件修改时间。我有理由不考虑 -t 吗?
  • @Chrips 不,我不这么认为。似乎这个答案的目的只是为了表明您可以在两个命令之间使用&& 在第一个命令之后立即自动运行第二个命令(如果第一个命令成功),而不是在之后手动运行一个另一个如@jsight的回答。另外,我认为在发布此答案后,@jsight 的答案已被编辑为包含-t 选项。
【解决方案5】:

使用rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

例如:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

将 xxx-files 同步到 different-stuff/xxx-files 。如果 different-stuff/xxx-files 不存在,它将创建它 - 即复制它。

-pogtEtv - 只是保留文件元数据的一堆选项,加上 v - 详细和 r - 递归

--progress - 实时显示同步进度 - 如果你复制大文件非常有用

--bwlimit=2000 - 设置复制/同步的最大速度(bw = 带宽)

P.S. rsync 在您通过网络工作时非常重要,如果是本地计算机,您可以使用诸如 cp 之类的命令。

祝你好运!

【讨论】:

    【解决方案6】:

    您需要的是Rclone。 Rclone(“用于云存储的 rsync”)是一个命令行 Linux 程序,用于将文件和目录与不同的云存储提供商(box、dropbox、ftp 等)和本地文件系统同步。 Rlone 仅支持镜像同步。

    另一个包含实时同步的图形化解决方案是使用FreeFileSync,其中包括程序 RealTimeSync。 FreefileSync 支持 2 向双向同步,包括处理删除。

    【讨论】:

    • FreeFileSync 很棒。推荐它。
    【解决方案7】:

    我有同样的问题,最终使用git。它可能不适合你的情况,但如果有人发现这个主题并有同样的问题,你可以考虑使用版本控制系统。

    【讨论】:

      【解决方案8】:

      我正在使用 rsyncinotifywait。 当你更改任何文件时,rsync 将被执行。

      inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"
      

      您需要在两台主机上运行inotifywait。请查看示例inotifywait

      【讨论】:

        猜你喜欢
        • 2010-11-03
        • 2022-11-09
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多