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

Luc*_*one 63 bash synchronization

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

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

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

顺便说一句:我在Ubuntu 12.04上

最终目标是拥有一个独立的实时备份副本,而无需使用符号链接或mount.我使用Ubuntu One来同步我的计算机之间的数据,过了一段时间出了问题,我的所有数据都在同步过程中丢失了.

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

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

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

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

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

sil*_*gon 70

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

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done
Run Code Online (Sandbox Code Playgroud)

  • 如果您想使用 SSH 作为传输来访问远程机器,您可能需要考虑将 `-e ssh user@remote:/target` 添加到 `rsync`。 (3认同)
  • 澄清:这是一次性运行的事情,还是你将它添加到bashrc或其他东西? (3认同)
  • 这不处理文件重命名,请使用“修改、创建、删除、移动” (3认同)
  • 感谢@Falcon,我通常使用`rsync -avz --delete --exclude-from = .rsyncignore / directory user @ server:path`。但是我想写一个简单的答案。 (2认同)
  • 我在尝试此操作时发现两个有用的提示: 1. 如果未安装 inotifywait,则需要 `apt-get install inotify-tools` (或 `dnf`、`yum`、`pacman` ...等)。2. 要在启动时运行它,请将其添加到退出行之前的 `/etc/rc.local` 中。 (2认同)

Mar*_*tin 18

你需要的东西是这样的: 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 -它应该是在Ubuntu存储库!

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

  • @apaidnerd 公平地说,有 90 个问题处于开放状态,而 420 个问题已关闭。不过,去年只有 10/40 的问题得以解决。 (2认同)

Den*_*zin 9

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

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done
Run Code Online (Sandbox Code Playgroud)

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

  • 我明白了。不过,因为这通常应该启动一次,并且只要服务器启动就一直运行;我会考虑在 rc.local 中内联一些东西。 (6认同)
  • 为什么要在 cron 中运行它? (2认同)

Mat*_*haq 7

使用跨平台fswatchrsync

fswatch -o /src | xargs -n1 -I{} rsync -a /src /dest
Run Code Online (Sandbox Code Playgroud)