【问题标题】:How to keep two folders automatically synchronized?如何保持两个文件夹自动同步?
【发布时间】:2012-09-09 17:30:31
【问题描述】:

我想要一个文件夹及其所有子树的同步副本。

它应该以这种方式自动工作:每当我从原始文件夹创建、修改或删除内容时,这些更改都应该自动应用于同步文件夹。

完成这项任务的最佳方法是什么?

顺便说一句:我使用的是 Ubuntu 12.04

最终目标是在不使用符号链接或挂载的情况下获得单独的实时备份副本。 我使用 Ubuntu One 在我的计算机之间同步数据,但过了一段时间出现了问题,我的所有数据在同步过程中都丢失了。

所以我想进一步添加一个步骤来保留我的数据的备份副本:

  • 我将数据保存在“文件夹 A”中
  • 我需要当前问题的答案来创建“文件夹 A”到“文件夹 B”的单向同步(cron 带有 rsync 的脚本?可能是?)。我需要它只从 A 到 B 是单向的,对 B 的任何更改都不能应用于 A。
  • 我只是与 Ubuntu One 保持同步“文件夹 B”

    通过这种方式,A 中的任何更改都将应用到 B,这将从 U1 检测到并同步到云端。如果出现任何问题,U1 删除了我在 B 上的数据,我总是将它们保存在 A 上。

受 lanzz 的 cmets 启发,另一个想法可能是在启动时运行 rsync 以备份 Ubuntu One 下文件夹的内容,并在 rsync 完成后启动 Ubuntu One。

你怎么看? 如何知道 rsync 何时结束?

【问题讨论】:

  • 你想完成什么?文件夹真的需要分开吗,您不能将一个名称符号链接到另一个名称,或者将bind-mount 目录链接到辅助位置吗?另外,看看these search results
  • 我建议反对实际实时同步(即持续监视源目录中的文件更改),而支持通过 cron 定期 rsync

标签: bash synchronization


【解决方案1】:

您可以使用inotifywait(启用modify,create,delete,move 标志)和rsync

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

如果您的系统上没有inotifywait,请运行sudo apt-get install inotify-tools

【讨论】:

  • 如果您想使用 SSH 作为传输方式访问远程计算机,您可能需要考虑将 -e ssh user@remote:/target 添加到 rsync
  • 感谢@Falcon,我通常使用rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path。但是我想写一个简单的答案。
  • 澄清一下:这是一次性运行的东西,还是您会将其添加到 bashrc 或其他东西中?
  • 您可以将整个while循环视为一个在需要时进行同步的进程。我通常将它添加到我正在处理的项目的 Makefile 中。这样我可以选择服务器和我想要保存的目录。我的一个用例是,当我在笔记本电脑中编写深度学习算法并将其同步以在具有更好 CPU 和 GPU 的专用计算机中执行繁重的过程时。我还排除了我不需要的文件,例如 .git 文件夹。
  • 这不处理文件重命名,使用modify,create,delete,move
【解决方案2】:

你需要这样的东西: https://github.com/axkibe/lsyncd 它是一个结合了 rsync 和 inotify 的工具 - 前者是一个工具,它通过正确的选项集将目录镜像到最后一位。后者告诉内核通知程序对目录 ot 文件的更改。 它说:

它将事件聚合和组合几秒钟,然后生成一个(或多个)进程以同步更改。

但是 - 根据 https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd 的 Digital Ocean 的说法 - 它应该在 Ubuntu 存储库中!

我有类似的要求,这个我还没有尝试过的工具似乎适合这项任务。

【讨论】:

  • lsyncd 起初看起来像是灵丹妙药,但它有 lots of open issues 并且显然 macOS 实现“过时且过时”。我无法让它在 10.12 上运行。
  • @apaidnerd 公平地说,有 90 个问题开放,420 个关闭。不过,去年只有 10/40 个问题被关闭。
【解决方案3】:

只是对@silgon 答案的简单修改:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(如果您在 cron 中运行 @silgon 版本,它有时会在 Ubuntu 16 上崩溃)

【讨论】:

  • 为什么要在 cron 中运行它?
  • @saygley 对于特定任务,在 Ubuntu 重新启动后,同步过程应该会自动运行
  • 我明白了.. 不过,因为这通常应该启动一次并且只要服务器启动就运行;我会考虑在 rc.local 中内联的东西。
  • 我加入了sleep 15m,这样您就可以看到记录的更改
【解决方案4】:

您可以利用fschange。这是一个 Linux 文件系统更改通知。源代码可以从上面的链接下载,你可以自己编译。 fschange 可用于通过从 proc 文件 (/proc/fschange) 读取数据来跟踪文件更改。将数据写入文件时,fschange 会报告已修改的确切时间间隔,而不仅仅是说文件已更改。 如果您正在寻找更高级的解决方案,我建议您查看Resilio Connect。 它是跨平台的,提供了使用和监控的扩展选项。由于它是基于 BitTorrent 的,它比任何其他现有的同步工具都快。它是代表他们写的。

【讨论】:

    【解决方案5】:

    我使用这个免费程序来同步本地文件和目录:https://github.com/Fitus/Zaloha.sh。该存储库还包含一个简单的演示。

    优点:它是一个 bash shell 脚本(只有一个文件)。不像其他程序那样是黑匣子。文档也在那里。此外,借助一些技术人才,您可以“弯曲”和“整合”它以创建您喜欢的最终解决方案。

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多