用rsync进行双向同步


95

我有一个文件夹a /和一个远程文件夹A /。现在,我在Makefile上运行以下内容:

get-music:
 rsync -avzru server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

当我制作sync-music时,它首先将所有差异从服务器发送到本地,然后将相反的内容从本地发送到服务器。

仅当将来只有更新或新文件时,此方法才能很好地工作。如果有删除,则不执行任何操作。

在rsync中,有--delete和--delete-after选项可以帮助实现我想要的功能,但事实是,它在2向同步中不起作用。

如果我想删除Syn上的服务器文件,则删除本地文件后,它可以工作,但是如果由于某种原因(稍后说明),我有一些不在服务器中但在本地存在的文件被删除,我想在本地删除它们,而不是服务器复制(发生这种情况)。

我在上下文中有3台机器:

  1. 桌面
  2. 笔记本
  3. 家庭服务器

因此,有时,服务器将具有通过笔记本同步删除的文件,例如,然后,当我与桌面运行同步时(已删除的服务器文件仍然存在),我希望这些文件被删除而不是被删除。再次复制到服务器。

我想这只有在数据库和操作轨迹下才有可能:P

还有更简单的解决方案吗?谢谢。


1
我有着同样的问题。MWM,您找到解决方案了吗?
mouche 2011年

7
我实际上现在做了。我试图获得类似Dropbox的体验,并想出了一个解决方案,该方案涉及统一(使用rsync)和lsyncd来监视文件更改。我还发现其他使用此解决方案的人以及其他更多技巧» brainmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm

如今,我在家庭服务器上本地使用nextcloud。完美的“投递箱”解决方案由我100%管理。有android / ios / win / macos / linux / web客户端。
mwm

Answers:


63

试试Unison:http//www.cis.upenn.edu/~bcpierce/unison/

句法: unison dirA/ dirB/

Unison询问文件不同时该怎么办,但是您可以通过使用以下接受默认(无冲突)选项的自动化操作:

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ 完全不问任何问题,并写输出忽略了多少文件(因为它们冲突)。


7
Unison对于小型目录非常易于使用。但是对于包含大量文件的目录来说,速度实在太慢了。在rsync几乎立即开始复制的地方,统一有时会花费12个小时以上的时间开始复制,因为它会在复制任何文件之前先扫描每个文件。
布伦特·浮士德·浮士德2014年

1
至少git易于使用且传输速度快。对于blob,由github开发的扩展名为Large File Storage
Wener 2015年

1
git的主要问题是大文件,它实际上是为显式提交设计的。既可以在通过合理改进的附加组件,如GIT-附件,大文件存储等
亚历克斯

3
@wener请勿使用锤子钉螺丝,也不要使用螺丝刀钉子。:)
ADTC

2
一致很棒-但也很不可靠。在大约50%的用例中,简单的方法没有用。最常见的原因是版本间功能差。有时我与没有权限的计算机上的内容同步。如果该服务器的版本与我的版本不同,则协调失败。另外,最近我在相同版本的统一客户端之间遇到了失败,因为它们使用的是某些库的不同编译版本(这是在ubuntu计算机和树莓派之间)。
argentum2f



5

由于最初的问题还涉及台式机和笔记本电脑以及涉及音乐文件的示例(因此,他可能正在使用GUI),所以我还要提到迄今为止最好的双向,多平台,免费和开源程序之一:FreeFileSync

它基于GUI,非常快速且直观,具有过滤功能和许多其他选项,包括远程连接,查看和交互管理“冲突”(例如,具有类似时间戳的文件)以及在双向传输,镜像和切换之间切换的功能。以此类推。


4

试试这个,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

我只是测试一下,它对我有用。我正在Windows7(使用安装了rsync软件包的cygwin)和FreeNAS文件服务器(FreeNAS在预装了rsync软件包的FreeBSD上运行)之间进行双向同步。


3
这不会删除新的本地文件吗?-u跳过目标上较新的文件,但是rsync没有跟踪删除时间的方法,因此该脚本如何区分本地文件是新文件(应保留)还是旧文件(应删除)之间的区别?还是我误会了?
Matthemattics

是否--delete-excluded删除目标目录但源目录中不存在的任何文件?我以为您必须定义,--exclude=<filename>所以rsync不会只删除这些排除项吗?还是rsync将所有非源目录文件都视为“排除”?
Mr_Moneybags 2013年

2
找到了答案:除了删除接收方不在发送方的文件之外,这还告诉rsync也删除接收方被排除的任何文件(请参阅--exclude)rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags 2013年

2
据我了解,如果我在目标上创建一个文件,然后执行rsync命令从源复制到目标,则由于没有使用时间戳,它将删除目标上的文件。这不是您想要的吗?
elexhobby 2014年

10
@Lübnah:正确;此解决方案不是完全2向同步的:因为rsync with --delete-excluded是首先以服务器作为运行的:在运行期间将删除本地添加的文件(而添加到服务器的文件将复制到本地目标)。唯一同步回服务器的本地文件是服务器上也存在的文件,并且在本地进行了修改(比服务器版本更新的文件),这在OP的场景中不太可能。正如您所暗示的,不能使用methinks真正的2路同步,因为需要在两次运行之间保存状态。 rsync
mklement0


1

我现在正在使用SparkleShare https://www.sparkleshare.org/

适用于Mac,Linux和Windows。


随着时间的流逝,我不断更新解决方案。我现在在家庭服务器上使用nextcloud。与Linux,Mac,Windows,Android和ios上的nextcloud客户端同步。
mwm

0

我不确定它是否可以与两个同步一起使用,但是要使--delete正常工作,您还需要添加--recursive参数。


1
OP 使用的option的简短等效项--recurse是(嵌入在compression-options组中)。-r-avzru
mklement0 2014年

0

您可以使用cloudsync使文件夹与远程服务器保持同步:

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

如果远程是NFS,则可以使用:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs

-1

Rclone是您想要的。Rclone(“用于云存储的rsync”)是一个命令行程序,用于与不同的云存储提供程序(包括本地文件系统)之间来回同步文件和目录。Rclone以前称为Swiftsync,自2013年以来一直可用。


它不支持双向同步:rclone.org/commands/rclone_sync
Martin Braun
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.