背景
在公司的笔记本上,使用oneDrive+MS Office 2019时,经常出现保存失败,要保存副本或另存为,甚至出现Visio无法打开oneDrive里的文件。而在MS Office 2019中将保存或打开本地路径,不是oneDrive路径,就没有一点问题。
工作中,OneNote的好用,是没有可替代的软件,所以只能卸载oneDrive,就需要另一个双向步云盘了。考虑过以下方向
- 自建服务器,但都是Linux的:seafile、nextcloud
- 另类云盘双向同步,自建FTP服务器:sftp/ftp+FreeFileSync/WinSCP;但公司网络中,禁用了ftp。
- FreeFileSync需要捐赠版,才能修改并发数,离谱的是只有捐赠版,才有便携版,非捐赠版安装需要管理员权限。
- openSSH-WIN64 碰到了标准用户连接,不能出shell的问题。
- 国内网盘基本是自动备份,不是双向自动同步。
- 阿里云盘据称支持双向自动同步,但公司里网速慢的令人发指,应该是被限制了;
- 腾讯微云的同步助手,在公司里下网速很慢,也应该是限制了;另外,下载后是需要管理员用户安装,不支持标准用户安装。
- 自建WebDav服务器:由于协议原因,上传文件后不能修改文件的修改日期与时间(测试:
rclone touch -C --localtime T725:/favicon.ico)- rclone无法可靠地判断文件内容(大小与修改时间)是否确实发生了变化,rclone提供了专门的解决方案:使用
--update(或简写-u)参数,但也只适用于单向同步(备份)。 --update:目标文件的修改时间是否比源文件旧,如果是,则执行同步。
- rclone无法可靠地判断文件内容(大小与修改时间)是否确实发生了变化,rclone提供了专门的解决方案:使用
- 将 rclone bisync 当oneDrive的客户端,做双向同步。
- 自建 rclone serve s3 服务器 + rclone bisync 做双向同步。
rclone bisycn 语法与参数
命令语法:rclone bisync <LOCAL_PATH> {remoteName}:path [flags]
同样,可以是本地与远程,也可以是远程与本地,还可以是远程与远程;但是,使用前,先看是否在支持列表中。rclone bisync -h查看可用参数
--backup-dir1 string Path1 的备份目录。必须是同一远程上不重叠的路径。
--backup-dir2 string Path2 的备份目录。必须是同一远程上不重叠的路径。
--check-access 确保在 Path1 和 Path2 文件系统上都能找到预期的 RCLONE_TEST 文件,否则中止操作。
--check-filename string --check-access 使用的文件名(默认值:RCLONE_TEST)
--check-sync string 控制最终列表的比较方式:true|false|only(默认值:true)
--compare string 以逗号分隔的双向同步特定比较选项列表,例如 'size,modtime,checksum'(默认值:'size,modtime')
--conflict-loser ConflictLoserAction 对同步冲突的输家(有赢家时)或两个文件(无赢家时)采取的操作:num, pathname, delete(默认值:num)
--conflict-resolve string 自动解决冲突,优先选择以下版本:none, path1, path2, newer, older, larger, smaller(默认值:none)
--conflict-suffix string 重命名 --conflict-loser 时使用的后缀。可以是一个字符串,也可以是两个用逗号分隔的字符串,分别为 Path1/Path2 指定不同的后缀。(默认值:'conflict')
--create-empty-src-dirs 同步空目录的创建和删除操作。(与 --remove-empty-dirs 不兼容)
--download-hash 当无法获取哈希值时,通过下载文件来计算哈希值。(警告:可能会很慢并消耗大量数据!)
--filters-file string 从文件中读取过滤规则
--force 绕过 --max-delete 安全检查并运行同步。建议与 --verbose 一起使用
-h, --help 显示 bisync 命令的帮助信息
--ignore-listing-checksum 列表时不使用校验和(添加 --ignore-checksum 以额外跳过复制后校验和检查)
--max-lock Duration 认为超过此时间的锁文件已过期(默认值:0(永不过期))(最小值:2m)
--no-cleanup 保留工作文件(有助于故障排除和测试)。
--no-slow-hash 仅在后端计算校验和较慢时忽略列表校验和
--recover 无需 --resync 即可自动从中断中恢复。
--remove-empty-dirs 在最终清理步骤中删除所有空目录。
--resilient 允许未来运行在某些不太严重的错误后重试,而不是需要 --resync。使用时请自行承担风险!
-1, --resync 执行重新同步操作。相当于 --resync-mode path1。建议先使用 --verbose 或 --dry-run。
--resync-mode string 重新同步时,优先选择以下版本:path1, path2, newer, older, larger, smaller(默认值:如果使用 --resync 则为 path1,否则为 none 表示不重新同步)
--slow-hash-sync-only 列表和差异计算时忽略慢校验和,但在同步调用时仍考虑它们。
--workdir string 使用自定义工作目录 - 用于测试。(默认值:{WORKDIR})单个目录双向同步验证
各有优缺点,今天就说说将 rclone bisync 当oneDrive的客户端,做双向同步。
如果你是第一次使用,请试着对单个文件夹,用最少的参数,做双向同步;成功后,再批量目录,增加参数。可以简化问题排查难度。
准备工作
前提:仅目录 D:\CloudFiles\ConfigBak\ 与 oneDrive:/ConfigBak/ 之间双向同步
CMD环境:注意doskey会明显感觉,要停顿2~3秒。
set RcloneDir=D:\CloudFiles\Rclone
set "toDay=%date:~2,2%%date:~5,2%%date:~8,2%"
set "rLog=--progress --verbose --log-file %RcloneDir%\Logs\%toDay%.log"
doskey rclone=%RcloneDir%\rclone.exe --config %~dp0Console\rclone.conf $*- 先使用sync或copy,单向同步一次:
rclone sync D:\CloudFiles\ConfigBak\ oneDrive:/ConfigBak/ %rLog%,有二个作用:- 先人工正确同步一次,是从本地到oneDrive,还是oneDrive到本地只有人工判断出来。
- 避免第2步有大量数据
- 再使用
--resync初次双向同步一次:rclone bisync D:\CloudFiles\ConfigBak\ oneDrive:/ConfigBak/ %rLog% --resync- 这步最关键是生成
%LOCALAPPDATA%\rclone\bisync\{paht1}...{path2}.paht1/2.lst的两个文件,因为默认是按--compare size,modtime校验,这二个文件中,是记录了各自路径下,所有文件的修改日期与大小,内容示例:
- 这步最关键是生成

- 验证:后续不使用
--resync参数的命令,是否正确。- 每次双向步会再次更新两个
xxx.lst文件,只保留上一次的副本,且重命名为xxx.lst.old
- 每次双向步会再次更新两个
@echo off
set "toDay=%date:~2,2%%date:~5,2%%date:~8,2%"
set exeDir=D:\CloudFiles\Rclone
set confDir=D:\CloudFiles\Console
rem --progress --verbose
%exeDir%\rclone.exe bisync D:\CloudFiles\ConfigBak\ oneDrive:/ConfigBak/ --config %confDir%\rclone.conf --log-level INFO --log-file %exeDir%\Logs\%toDay%.log日常定时自动双向同步计划任务
在计划任务中,添加定时任务,以什么样的频率,运行BAT文件。
多个目录的双向同步
场景:在 D:\CloudFiles\ 与 oneDrive: 之间,仅双向同步特定的目录下子目录与文件;且都有不同的,不需要同步的子目录与文件,如图:

接上面的CMD环境,先对新建目录
rclone sync oneDrive:/Pictures/ d:\CloudFiles\Pictures\ %rLog%
rclone copy D:\CloudFiles\Sysinternals\ oneDrive:/Sysinternals/ %rLog%创建UTF-8的rclone.filter文本文件,实现在 D:\CloudFiles\ 与 oneDrive: 之间,只同步特定的目录下子目录与文件。
# oneDrive 的过滤
+ /ConfigBak/**
- /Documents/baozun/**
+ /Documents/**
+ /Sysinternals/**
+ /Pictures/**
# 排除其他所有子目录与文件
- /**
再手工同步一次:rclone sync D:\CloudFiles\ oneDrive:/ --filter-from %ConsoleDir%\rclone.filter --ignore-case %rLog%
为两边差异准备备份目录:
rclone mkdir oneDrive:/bisyncDifferBak/
rclone mkdir D:\CloudFiles\bisyncDifferBak首次全量双向同步,为了创建出xxx.lst文件
rclone bisync D:\CloudFiles\ oneDrive: --filter-from %ConsoleDir%\rclone.filter --ignore-case --backup-dir1 D:\CloudFiles\bisyncDifferBak\ --backup-dir2 oneDrive:/bisyncDifferBak/ %rLog% --resync --dry-run- 由于oneDrive的根目录,所以不能写
oneDrive:/??不确认,没有验证
后续双向同步,有差异,被删除的都移到各自的bisyncDifferBak目录中。
rclone bisync D:\CloudFiles\ oneDrive: --filter-from %ConsoleDir%\rclone.filter --ignore-case --backup-dir1 D:\CloudFiles\bisyncDifferBak\ --backup-dir2 oneDrive:/bisyncDifferBak/ %rLog% --dry-run日常定时自动同步的bat
@echo off
set "toDay=%date:~2,2%%date:~5,2%%date:~8,2%"
rem Rclone.exe与logs的目录
set exeDir=D:\CloudFiles\Rclone
rem rclone.conf与rclone.filter的目录
set confDir=D:\CloudFiles\Console
rem --progress --verbose
%exeDir%\rclone.exe bisync D:\CloudFiles\ oneDrive: --config %confDir%\rclone.conf --log-level INFO --log-file %exeDir%\Logs\%toDay%.log --filter-from %confDir%\rclone.filter --ignore-case --backup-dir1 D:\CloudFiles\bisyncDifferBak\ --backup-dir2 oneDrive:/bisyncDifferBak/注意事项
如果您连续 90 天不使用 rclone,刷新令牌将会过期。这将导致授权问题。解决此问题很简单,只需运行 rclone config reconnect {remoteName}: 命令来获取新的令牌和刷新令牌。
发表回复