如何保持两个文件夹自动同步?


86

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

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

哪个是完成此任务的最佳方法?

顺便说一句:我在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何时结束?


你想达到什么目的?文件夹是否真的需要分开?是否不能将一个名称符号链接到另一个名称,或者目录绑定安装到第二个位置?另外,看看这些搜索结果
lanzz 2012年

1
我建议您不要进行实际的实时同步(即连续监视源目录中的文件更改),而建议rsync通过cron进行定期同步。
lanzz 2012年

Answers:


99

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


3
如果您想使用SSH作为访问远程计算机的传输方式-e ssh user@remote:/targetrsync则可能要添加。
猎鹰

2
谢谢@Falcon,我通常使用rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path。但是我想写一个简单的答案。
silgon

4
澄清一下:这是一次性的事情,还是您将其添加到bashrc之类的东西中?
布拉德·约翰逊

1
您可以将整个while循环视为在需要时进行同步的过程。我通常将其添加到我正在处理的项目的Makefile中。这样,我可以选择服务器和要保存的目录。我的用例之一是当我在笔记本电脑中编写深度学习算法,并对其进行同步以在具有更好CPU和GPU的专用计算机中执行繁重的过程。我还排除了不需要的.git文件,例如文件夹。
silgon

2
这不能处理文件重命名,请使用modify,create,delete,move
urusha

24

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

它会汇总并合并事件几秒钟,然后生成一个(或多个)进程来同步更改。

但是-根据Digital Ocean(https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd)的介绍,它应该位于Ubuntu存储库!

我有类似的要求,但我尚未尝试使用的该工具似乎很适合该任务。


1
最初,lsyncd似乎是灵丹妙药,但是它有很多未解决的问题,而且显然macOS的实现“已经过时了”。我无法在10.12上运行。
的付费书呆子

@apaidnerd公平地说,它有90期未解决,而420期已结束。不过,去年仅关闭了10/40期。
Mateen Ulhaq

8

@silgon答案的简单修改:

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

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


2
为什么要在cron中运行它?
saygley

@saygley对于特定任务,Ubuntu重新启动后,同步过程应自动运行
Denis Kuzin

5
我明白了。尽管如此,由于通常应该启动一次,并且只要服务器启动就可以运行;我会考虑在rc.local中内联的东西。
saygley

2

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


0

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

好处是:这是一个bash shell脚本(仅一个文件)。没有其他程序那样的黑匣子。文档也在那里。此外,借助一些技术人才,您可以对其进行“弯曲”和“集成”,以创建所需的最终解决方案。

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.