108

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

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

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

顺便说一句:我在 Ubuntu 12.04

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

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

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

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

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

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

4

5 回答 5

126

您可以使用inotifywaitmodify,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

于 2016-11-10T10:25:00.900 回答
28

你需要这样的东西: 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存储库!

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

于 2016-04-13T09:31:28.777 回答
9

只需简单修改@silgon 答案:

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

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

于 2018-09-23T14:50:27.450 回答
2

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

于 2018-10-16T06:09:45.940 回答
1

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

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

于 2020-01-08T16:12:46.383 回答