Onedrive如何同步指定文件夹
整合转载,两种方法均可以
方法一
同步指定文件夹
原理:
借助符号连接把其他路径的文件夹,创建在自动同步的文件夹中。
步骤:
- 点击开始菜单,在搜索框中输入cmd,右键选择以管理员模式运行命令提示符。
- 输入以下命令并执行,创建目录符号链接。命令模板:
mklink /d "本地OneDrive路径 - 同步到的文件夹名称" "被同步的文件夹路径"
示例:
mklink /d "D:\OneDrive - syncNotes" "D:\myNotes"
注意:这里OneDrive中对应的同步文件夹不需要提前创建,如果提前创建会出错。
这样我们就可以将该文件夹同步到OneDrive了。
但这样做带来的问题是,由于OneDrive中的文件夹是映射的文件夹,在原来的文件夹中我们执行任何的修改都是没法立刻同步到OneDrive的。当然,可以通过退出再登陆OneDrive来进行一次同步,不过这样做十分的麻烦,更简单的方法是:编写一个脚本来手动开启同步传输。
手动开启同步传输
原理:
在本地OneDrive文件夹中删除一个文件时,OneDrive会对包括映射文件夹在内的所有的未同步文件进行同步。下面我们编写的脚本可以在当前目录下删除一个原有的文件,创建一个新的文件。
步骤:
- 在OneDrive中新建一个文本文件,命名为”OneDriveSync.txt“
- 将以下内容粘贴到刚刚创建的文件中
set prefix=OneDriveSyncFlag set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% set "timestamp=%timestamp: =0%" del /f/q %prefix%* type nul>OneDriveSyncFlag%timestamp%
- 修改文件后缀名为".bat"
- 在第一次使用时,需要运行两次这个文件,才能开启同步。之后只需要运行一次即可。
对于问题:如果后续在文件夹里增删, 它不会自动同步, 要同步还得重新退出再启动onedrive, 不能像它自带的三个文件夹一样实时同步, 而且这种已经上传了还显示同步已挂起
解决方法如下:
在OneDrive目录下,新建一个OneDriveSync.bat文件,内容如下:
set prefix=OneDriveSyncFlag set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% set "timestamp=%timestamp: =0%" del /f/q %prefix%* type nul>OneDriveSyncFlag%timestamp%
新建完成后,首次需要运行两次OneDriveSync.bat,会创建一个空的文件(用来实现同步的),之后只需要运行一次即可,即可实现手动文件内容同步到OneDrive中,无需重新退出登录。
原理:OneDrive会对 OneDrive目录下(仅OneDrive/目录)文件的增加删除,而对整个OneDrive进行一次文件的同步操作, 所以利用这个特性,实现手动OneDrive同步
方法二
谈谈自己使用OneDrive的一点心得,走过的弯路,以及最终的解决方法。
- E5开发者账号,OneDrive有1TB空间,上传速度有10MB/S左右,因此适合备份资料。以前是用NAS定期手动备份,如果用OneDrive优势很多,比如文件仅自己可见,比如在外网也能备份,比如手机上装了OneDrive或Teams后很方便在手机上查看。
- 但是OneDrive默认只能备份下图这3个文件夹,因此显而易见,必须将工作资料放在Desktop或Doucments文件夹中。
准确的说,除了这3个文件夹,还有一个文件夹:“C:\Users\用户名\OneDrive”。
使用了一下,可以发现:OneDrive的实时性很强,你在备份文件夹里做的所有操作(新增、删除、修改),OneDrive会立即进行同步(这一点有利有弊,后面再谈)。
- 如果不想把文件放在以上3个目录中,或IT Policy对文件放置路径有要求(如必须是C盘根目录/工号命名的文件夹),举例来说:工作文件在"C:\1001"下,你在OneDrive可以备份的Desktop文件夹下创建一个指向"C:\1001"的快捷方式,这显然是不行的,因为快捷方式是一个"*.Ink"的文件,最终同步上去的只是一个"1001 - Shortcut.Ink"的文件。
- 那么你会搜到很多教程告诉你用mklink(用法参见微软文档:mklink | Microsoft Docs)。举例来说,在cmd中运行mklink命令(需要管理员模式):
运行后,就在Desktop下就创建了一个指向"C:\1001"的“快捷方式”(下图第1个),请注意:这个快捷方式与上面3所创建快捷方式不同!虽然图标是一样的,但通过mklink创建的快捷方式,其属性是“文件夹”,这是本质区别。
- 我用mklink方法将其它目录下的工作文件夹,链接到OneDrive下,使用一段时间发现一个问题:如果你是在Desktop(或Documents、Pictures)内做的任何文件或文件夹修改,OneDrive会立即发现并做同步(工具栏OneDrive图标变成同步状态),但是在mklink指向的文件夹中做的变更,OneDrive是发现不了的。
举例说,你在"C:\1001"下做了变更,虽然你已经将该目录链接到Desktop下了,但是OneDrive发现不了,不会自动同步!
但如果将OneDrive退出再重新登录,OneDrive会扫描到"C:\1001"下有变更,然后进行同步。
也就是说用mklink创建的链接,OneDrive不会实时同步,只有OneDrive重启时才会同步。
-
既然mklink存在这样的问题,且我平时电脑从不关闭,这样我就必须经常退出/重新登录OneDrive来实现对mklink链接文件夹的同步,这样很不方便。
-
如果你经常退出/重新登录OneDrive,或某段时间OneDrive闪退了,会发现一个问题:在OneDrive关闭期间,如果做了文件修改,当OneDrive重新登录后,本地文件会加后缀“-计算机名”,并同步至OneDrive。请注意:OneDrive将你的本地文件重命名了!
举例来说:
如果你本地有文件A,由于OneDrive在运行,因此OneDrive上也有文件A,两者内容完全一致。当你修改了本地文件A,OneDrive会立即发现,并将修改后的A上传并替换OneDrive上较旧的文件A。
但如果你在OneDrive关闭期间修改了文件A,当OneDrive启动后,发现本地A比OneDrive上的文件A较新,则会将本地文件A重命名为“A-计算机名”,并上传到OneDrive,由于文件名不同,OneDrive上较旧的文件A不会被替换。这个逻辑的好处是:只有OneDrive真正监测到了你对文件做了变更,才会替换云上的文件,如果它没监测到,就不会随意删除/替换你云上的文件,这样做确实对文件安全有利。
但会造成另一个麻烦:如果你在OneDrive关闭期间,修改了很多文件,当OneDrive启动后,OneDrive会将本地所有新文件进行重命名(增加计算机名后缀),这样就很麻烦了,毕竟我们平常不会去关注OneDrive究竟有没有在运行。
-
第2点说到OneDrive会立即同步变更的文件/文件夹,有点有利有弊,好处显而易见,但对一些工程人员有个坏处:比如我经常编译文件,中途会产生大量临时文件,OneDrive检测到有新文件生成,必然要同步,但当编译完后,一些编译文件又删除了,很显然,OneDrive立即同步的逻辑会浪费CPU资源和网络带宽。
-
正由于第7点和第8点的缘故(重命名本地文件,上传临时文件浪费带宽),如果:
- OneDrive能够单向同步,即Local -> Cloud,而不是Local <-> Cloud,但OneDrive只提供后者功能。
- 能设置计划任务就好了,比如只在每天下班时做个同步,但似乎OneDrive也没这个功能。
- 于是我想到了“FreeFileSync”(官网:FreeFileSync: Open Source File Synchronization & Backup Software),只需要通过FreeFileSync将“C:\1001\”镜像同步到“C:\Users\用户名\OneDrive”目录下就行。这样,同步是我主动发起的,而不是每时每刻都在做。这样就解决了第9点的问题。
-
如果每次下班要手动点一下同步,还是比较麻烦,能不能定时自动运行FreeFileSync?方法是有的,FreeFileSync给出了方法,参见:Schedule Batch Jobs - FreeFileSync,原理是把要做的同步工作,创建成一个FreeFileSync批处理文件“.ffs_batch”,然后在Windows计划任务中添加一个任务:运行输入“taskschd.msc”,添加一个Task,General里输入名称,Triggers里执行时间,Actions里输入需要执行的“.ffs_batch”,这样就可以每天自动镜像同步了。
-
也许你已经发现10-11的方法存在的问题了:“C:\1001\”和“C:\Users\用户名\OneDrive”目录下,同时存在2份文件,这样白白浪费硬盘空间了!
解决方法是:在FreeFileSync批处理“.ffs_batch”中,可以设置同步完后执行命令,只需要在下图“Run a command”中输入:“cd C:\Users\用户名\OneDrive && attrib +U -P /s”,即可在同步完后释放本地Onedrive空间。
注意“&&”是两行命令的连接符号,FreeFileSync里只能输入一行命令,如果想输入两行命令,需要用“&&”连接符。
执行完这条命令,等OneDrive同步完成,查看OneDriver文件夹里的文件夹属性,可以发现文件夹Size很大,但Size on disk几乎没有,见下图。
讲一下这条命令的原理:执行上面的命令,实际上相当于在文件夹右键执行“Free up space”,这样被上传到OneDrive的文件,将全部从本地释放硬盘空间,当你要打开某个文件时,将自动从云端下载。
所有Free up space的文件/文件夹,都有一个云的图标,表示该文件只在云端存储。
另外,关于OneDrive图标含义,参见微软文档:OneDrive 图标的含义是什么? (microsoft.com)
\13. 关于第12条提到的Free up space是如何用命令实现的,我是查了很多资料后,在这两篇文章里发现的:
OneDrive Files On-Demand For The Enterprise - Microsoft Tech Community
总结:
如果你是普通用户或文职人员,只需要把文件放在:
- 桌面(C:\Users\用户名\Desktop)
- 文档(C:\Users\用户名\Documents)
- 图片(C:\Users\用户名\Pictures)
- OneDrive目录(C:\Users\用户名\OneDrive)
除了第4个是不用设置的,前3个需要在OneDrive设置里打开同步开关。
不建议放在其它目录或其它硬盘,然后用mklink方法,原因见第5条。
如果对于像我这样的用户,只需要单向同步,我目前的方法如前文所说,通过以下4个组合,完成了本地工作文件的定时、单向的备份,该方法虽看起来麻烦,但只需设置一次。
- OneDrive
- FreeFileSync
- Windows计划任务
- Free up space命令
大家要是有更好的方法,欢迎讨论~
=====
最后补充一点:
为什么OneDrive只支持同步“桌面”、“文档”、“图片”这3个文件夹?
为什么不能设置任意文件夹?这点比较费解,但背后的原因其实很简单:OneDrive只能同步“C:\Users\用户名\OneDrive”路径下的文件。
当你在OneDrive设置里,开启同步“桌面”时,它其实是将你的桌面文件夹“C:\Users\用户名\Desktop”移动到了“C:\Users\用户名\OneDrive”下面,你桌面上的文件,其实都在“C:\Users\用户名\OneDrive\Desktop”里。
如果你后来在OneDrive设置里,关闭“桌面”同步时,你桌面的所有文件会不见,只有一个“Where are my files”的快捷方式,其实OneDrive并未帮你将“C:\Users\用户名\OneDrive\Desktop”下的文件移回到“C:\Users\用户名\Desktop”下,而是通过一个快捷方式,告诉你桌面上原来的文件仍然在“C:\Users\用户名\OneDrive\Desktop”,需要用户自己手动移回来
参考
方法一:Onedrive 如何同步一个文件夹? - 知乎 (zhihu.com)
方法二:Onedrive 如何同步一个文件夹? - 知乎 (zhihu.com)