与 rsync 的两种方式同步
Posted
技术标签:
【中文标题】与 rsync 的两种方式同步【英文标题】:Two way sync with rsync 【发布时间】:2011-02-25 13:40:06 【问题描述】:我有一个文件夹 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
当我制作同步音乐时,它首先将所有差异从服务器获取到本地,然后相反,将所有差异从本地发送到服务器。
仅当将来只有更新或新文件时,此方法才能很好地工作。如果有删除,它不会做任何事情。
在 rsync 中有 --delete 和 --delete-after 选项来帮助完成我想要的,但事实是,它不适用于 2-way-sync。
如果我想删除 syn 上的服务器文件,当本地文件被删除时,它可以工作,但是如果由于某种原因(稍后解释)我有一些文件不在服务器中但在本地存在并且它们被删除,我想在本地删除它们而不是服务器复制(碰巧)。
事情是我在上下文中有 3 台机器:
-
桌面
笔记本
家庭服务器
因此,有时,服务器会包含通过笔记本同步删除的文件,例如,当我与桌面运行同步时(已删除的服务器文件仍然存在),我希望删除这些文件并不会再次复制到服务器。
我想这只有通过数据库和操作跟踪才有可能:P
有更简单的解决方案吗? 谢谢。
【问题讨论】:
我也有同样的问题。你找到解决方案了吗,mwm? 我现在确实做到了。我试图实现类似 Dropbox 的体验,并提出了一个解决方案,其中涉及使用 unison(使用 rsync)和 lsyncd 来监控文件更改。我还发现其他人使用此解决方案和更多技巧»cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu 现在我在我的家庭服务器上本地使用 nextcloud。完美的“保管箱”解决方案 100% 由我管理。有 android/ios/win/macos/linux/web 客户端。 【参考方案1】:试试 Unison:http://www.cis.upenn.edu/~bcpierce/unison/
语法:
unison dirA/ dirB/
当文件不同时,Unison 会询问要做什么,但您可以使用以下接受默认(非冲突)选项的选项来自动执行该过程:
unison -auto dirA/ dirB/
unison -batch dirA/ dirB/
根本不问任何问题,并写入输出有多少文件被忽略(因为它们发生冲突)。
注意:我不再使用 Unison(我使用 NextCloud,它没有解决原始用例)。但是,请注意rsync
不是为双向同步而设计的,而unison
是。 unison
可能有它的错误(就像任何其他软件一样)和它的皱纹。我很惊讶它现在似乎得到了积极的维护(上次我看起来我认为我认为它看起来已经死了),但我不确定现在的状态是什么。我不需要双向文件同步器,所以可能有更好的选择。
【讨论】:
Unison 非常容易用于小型目录。但是对于具有大量文件的目录来说,速度非常慢。 rsync 几乎会立即开始复制,而 unison 有时需要 12 多个小时才能开始复制,因为它会在复制任何内容之前扫描每个文件。 它 git 擅长这个?至少 git 易于使用且传输速度快。对于 blob,有一个由 github 开发的扩展名为 Large File Storage。 git 的主要问题是大文件,它实际上是为显式提交而设计的。两者都可以通过 git-annex、大文件存储等附加组件进行合理改进。 @wener 不要用锤子拧螺丝,也不要用螺丝刀拧钉子。:)
unison 很棒 - 但也非常不可靠。在我大约 50% 的用例中,简单的方法没有奏效。最常见的原因是版本间能力差。我有时会与我没有权限的计算机上的内容同步。如果该服务器恰好具有与我不同的版本,则统一失败。此外,我最近在同一版本的统一客户端之间失败了,因为它们使用了某些库的不同编译版本(这是在 ubuntu 计算机和树莓派之间)。【参考方案2】:
由于最初的问题还涉及台式机和笔记本电脑以及涉及音乐文件的示例(因此他可能使用的是 GUI),我还要提到最好的双向、多平台、免费和开源程序之一日期:FreeFileSync。
它基于 GUI,非常快速和直观,带有过滤和许多其他选项,包括远程连接、查看和交互式管理“冲突”(例如,具有相似时间戳的文件)以及在双向传输之间切换的能力、镜像等。
【讨论】:
【参考方案3】:你也可以试试 bitpocket:https://github.com/sickill/bitpocket
【讨论】:
【参考方案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(使用 cygwin 并安装了 rsync 包)和 FreeNAS 文件服务器(FreeNAS 在 FreeBSD 上运行并预装了 rsync 包)之间进行双向同步。
【讨论】:
这不会删除新的本地文件吗?-u
跳过目标上较新的文件,但 rsync 没有跟踪删除时间的方法,所以这个脚本如何区分本地文件是新文件(应该保留)还是旧文件(应该被删除)?还是我误会了?
--delete-excluded
是否删除存在于目标目录但不存在于源目录的任何文件?我以为你必须定义 --exclude=<filename>
所以不会 rsync 只删除这些排除项?还是 rsync 是否将所有非源目录文件视为“排除”?
找到了答案:除了删除接收端不在发送端的文件之外,这告诉 rsync 还要删除接收端所有被排除在外的文件(参见 --exclude ) rsync.samba.org/ftp/rsync/rsync.html
据我了解,如果我在目标上创建一个文件,然后执行 rsync 命令从源复制到目标,它将删除目标处的文件,因为没有使用时间戳。这不是你想要的对吧?
@Lübnah:正确;此解决方案不是完整的 2 路同步:因为与 --delete-excluded
的 rsync 首先以 服务器 作为 源 运行:文件 本地添加将在该运行期间删除(而添加到服务器的文件复制到本地目标)。同步回服务器的唯一本地文件是也存在于服务器上并且在本地修改(比服务器版本更新)的文件 - 这不太可能在OP的场景。正如您所暗示的,我认为真正的 2 路同步无法使用 rsync
完成,因为需要在运行之间保存状态。【参考方案5】:
您可以使用 Osync: http://www.netpower.fr/osync ,它是基于 rsync 的智能删除传播。它还有多个选项,例如恢复暂停执行、软删除和时间控制。
【讨论】:
【参考方案6】:你可以试试csync,它是owncloud 底层的同步引擎。
【讨论】:
截至 2018 年,csync 开发似乎停滞不前,owncloud 看起来像是在分叉它。请参阅:github.com/owncloud/client/issues/4661 了解更多详情【参考方案7】:我现在正在使用 SparkleShare https://www.sparkleshare.org/
适用于 mac、linux 和 windows。
【讨论】:
随着时间的推移,我不断更新我的解决方案。我现在在我的家庭服务器上使用 nextcloud。在 linux、mac、windows、android 和 ios 上与 nextcloud 客户端同步。【参考方案8】:我很惊讶还没有人提到Syncthing。多年来,我一直在使用它来同步我的手机、平板电脑和两台笔记本电脑。有一次,我还用它向我的家人发送了 10 GB 的照片,距离大约 600 公里,从我的机器直接发送到他们的机器,而且速度非常快(尽管数据通过 Syncthing 的发现服务器路由以解决 NAT 问题)。我也曾尝试过 OwnCloud/NextCloud,但 Syncthing 更可靠,而且速度也更快。
【讨论】:
【参考方案9】:我不确定它是否适用于两个同步,但要使 --delete 起作用,您还需要添加 --recursive 参数。
【讨论】:
选项--recurse
的简短等效项是-r
,OP 正在 使用它(嵌入压缩选项组-avzru
)。【参考方案10】:
您可以使用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
【讨论】:
【参考方案11】:Rclone 是您正在寻找的。 Rclone(“用于云存储的 rsync”)是一个命令行程序,用于将文件和目录与不同的云存储提供商(包括本地文件系统)同步。 Rclone 以前称为 Swiftsync,自 2013 年以来一直可用。
【讨论】:
不支持双向同步:rclone.org/commands/rclone_sync以上是关于与 rsync 的两种方式同步的主要内容,如果未能解决你的问题,请参考以下文章