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

Bash 如何保持两个文件夹自动同步?,bash,synchronization,Bash,Synchronization,我想要一个文件夹及其所有子树的同步副本 它应该以这种方式自动工作:每当我从原始文件夹中创建、修改或删除内容时,这些更改都应该自动应用于同步文件夹 完成此任务的最佳方法是什么? 顺便说一句:我在Ubuntu 12.04上 最终目标是拥有一个独立的实时备份拷贝,而不使用符号链接或挂载。 我使用UbuntuOne在我的计算机之间同步数据,过了一段时间,出现了一些问题,在同步过程中我所有的数据都丢失了 因此,我想进一步添加一个步骤来保留数据的备份副本: 我将数据存储在“文件夹a”中 我需要当前问题的答

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

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

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

顺便说一句:我在Ubuntu 12.04上

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

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

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

    以这种方式,A中的任何更改都将应用于B,B将从U1检测并同步到云。如果出了什么问题,U1删除了我在B上的数据,我总是把它们放在A上
受lanzz评论的启发,另一个想法可能是在启动时运行rsync,以备份Ubuntu One下文件夹的内容,并在rsync完成后启动Ubuntu One

你觉得怎么样?
如何知道rsync何时结束?

您需要这样的信息: 它是一个结合了rsync和inotify的工具,前者是一个通过正确的选项集将目录镜像到最后一位的工具。后者告诉内核通知程序对目录ot文件的更改。 它说:

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

但是,根据Digital Ocean at的说法,它应该在Ubuntu存储库中


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

您可以使用
inotifywait
(启用
修改、创建、删除、移动
标志)和
rsync

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

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

只需简单修改@silgon答案:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done
(@silgon版本有时在Ubuntu 16上崩溃,如果你在cron中运行它)

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

我使用此免费程序同步本地文件和目录:。存储库还包含一个简单的演示


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

您想实现什么?文件夹真的需要分开吗?你不能将一个名称符号链接到另一个名称,或者将目录符号链接到辅助位置吗?另外,请看一下。我建议不要进行实际的实时同步(即持续监视源目录中的文件更改)通过CRON支持定期<代码> RSYNC 。您可能需要考虑添加<代码> -E SSH。user@remote:/target到
rsync
如果您想使用SSH作为传输来访问远程计算机。感谢@Falcon,我通常使用
rsync-avz--delete--exclude from=.rsyncignore/目录user@server:路径
。不过,我想写一个简单的答案。澄清:这是一次性运行的东西,还是将它添加到BasHC或什么?您可以将整个while循环视为需要时同步的过程。我通常将其添加到我正在处理的项目的Makefile中。这样我就可以选择服务器和我想要保存的目录。我的一个使用案例是,我在笔记本电脑中编写深度学习算法,并将其同步,以便在具有更好CPU和GPU的专用计算机上执行繁重的过程。我还排除了我不需要的文件,例如
.git
文件夹。这不处理文件重命名,使用
修改、创建、删除、移动
lsyncd起初看起来像是一颗银弹,但它有,而且显然macOS实现“陈旧过时”。我无法让它在10.12上运行。@apaidnerd公平地说,90期未结,420期未结。尽管如此,去年只有10/40的问题被解决了。你为什么要在cron中运行它呢?@saygley,在Ubuntu重新启动后,同步过程应该自动运行。我看。。然而,由于这通常应该启动一次,并且只要服务器启动就可以运行;我会考虑在R.C.Curror中内联的一些东西。我包含了<代码>睡眠15m < /代码>,您可以看到日志记录的更改。