Onedrive如何同步指定文件夹

整合转载,两种方法均可以

方法一

同步指定文件夹

原理:

借助符号连接把其他路径的文件夹,创建在自动同步的文件夹中。

步骤:

  1. 点击开始菜单,在搜索框中输入cmd,右键选择以管理员模式运行命令提示符。
  2. 输入以下命令并执行,创建目录符号链接。命令模板:
mklink /d "本地OneDrive路径 - 同步到的文件夹名称" "被同步的文件夹路径"

示例:

mklink /d "D:\OneDrive - syncNotes" "D:\myNotes"

注意:这里OneDrive中对应的同步文件夹不需要提前创建,如果提前创建会出错。

这样我们就可以将该文件夹同步到OneDrive了。

但这样做带来的问题是,由于OneDrive中的文件夹是映射的文件夹,在原来的文件夹中我们执行任何的修改都是没法立刻同步到OneDrive的。当然,可以通过退出再登陆OneDrive来进行一次同步,不过这样做十分的麻烦,更简单的方法是:编写一个脚本来手动开启同步传输。

手动开启同步传输

原理:

在本地OneDrive文件夹中删除一个文件时,OneDrive会对包括映射文件夹在内的所有的未同步文件进行同步。下面我们编写的脚本可以在当前目录下删除一个原有的文件,创建一个新的文件。

步骤:

  1. 在OneDrive中新建一个文本文件,命名为”OneDriveSync.txt“
  2. 将以下内容粘贴到刚刚创建的文件中
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%
  1. 修改文件后缀名为".bat"
  2. 在第一次使用时,需要运行两次这个文件,才能开启同步。之后只需要运行一次即可。

对于问题:如果后续在文件夹里增删, 它不会自动同步, 要同步还得重新退出再启动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的一点心得,走过的弯路,以及最终的解决方法。

  1. E5开发者账号,OneDrive有1TB空间,上传速度有10MB/S左右,因此适合备份资料。以前是用NAS定期手动备份,如果用OneDrive优势很多,比如文件仅自己可见,比如在外网也能备份,比如手机上装了OneDrive或Teams后很方便在手机上查看。

img

  1. 但是OneDrive默认只能备份下图这3个文件夹,因此显而易见,必须将工作资料放在Desktop或Doucments文件夹中。

准确的说,除了这3个文件夹,还有一个文件夹:“C:\Users\用户名\OneDrive”。

使用了一下,可以发现:OneDrive的实时性很强,你在备份文件夹里做的所有操作(新增、删除、修改),OneDrive会立即进行同步(这一点有利有弊,后面再谈)。

img

  1. 如果不想把文件放在以上3个目录中,或IT Policy对文件放置路径有要求(如必须是C盘根目录/工号命名的文件夹),举例来说:工作文件在"C:\1001"下,你在OneDrive可以备份的Desktop文件夹下创建一个指向"C:\1001"的快捷方式,这显然是不行的,因为快捷方式是一个"*.Ink"的文件,最终同步上去的只是一个"1001 - Shortcut.Ink"的文件。

img

  1. 那么你会搜到很多教程告诉你用mklink(用法参见微软文档:mklink | Microsoft Docs)。举例来说,在cmd中运行mklink命令(需要管理员模式):

img

运行后,就在Desktop下就创建了一个指向"C:\1001"的“快捷方式”(下图第1个),请注意:这个快捷方式与上面3所创建快捷方式不同!虽然图标是一样的,但通过mklink创建的快捷方式,其属性是“文件夹”,这是本质区别。

img

  1. 我用mklink方法将其它目录下的工作文件夹,链接到OneDrive下,使用一段时间发现一个问题:如果你是在Desktop(或Documents、Pictures)内做的任何文件或文件夹修改,OneDrive会立即发现并做同步(工具栏OneDrive图标变成同步状态),但是在mklink指向的文件夹中做的变更,OneDrive是发现不了的。

举例说,你在"C:\1001"下做了变更,虽然你已经将该目录链接到Desktop下了,但是OneDrive发现不了,不会自动同步!

但如果将OneDrive退出再重新登录,OneDrive会扫描到"C:\1001"下有变更,然后进行同步。

也就是说用mklink创建的链接,OneDrive不会实时同步,只有OneDrive重启时才会同步。

  1. 既然mklink存在这样的问题,且我平时电脑从不关闭,这样我就必须经常退出/重新登录OneDrive来实现对mklink链接文件夹的同步,这样很不方便。

  2. 如果你经常退出/重新登录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究竟有没有在运行。

  1. 第2点说到OneDrive会立即同步变更的文件/文件夹,有点有利有弊,好处显而易见,但对一些工程人员有个坏处:比如我经常编译文件,中途会产生大量临时文件,OneDrive检测到有新文件生成,必然要同步,但当编译完后,一些编译文件又删除了,很显然,OneDrive立即同步的逻辑会浪费CPU资源和网络带宽。

  2. 正由于第7点和第8点的缘故(重命名本地文件,上传临时文件浪费带宽),如果:

  • OneDrive能够单向同步,即Local -> Cloud,而不是Local <-> Cloud,但OneDrive只提供后者功能。
  • 能设置计划任务就好了,比如只在每天下班时做个同步,但似乎OneDrive也没这个功能。
  1. 于是我想到了“FreeFileSync”(官网:FreeFileSync: Open Source File Synchronization & Backup Software),只需要通过FreeFileSync将“C:\1001\”镜像同步到“C:\Users\用户名\OneDrive”目录下就行。这样,同步是我主动发起的,而不是每时每刻都在做。这样就解决了第9点的问题。

img

  1. 如果每次下班要手动点一下同步,还是比较麻烦,能不能定时自动运行FreeFileSync?方法是有的,FreeFileSync给出了方法,参见:Schedule Batch Jobs - FreeFileSync,原理是把要做的同步工作,创建成一个FreeFileSync批处理文件“.ffs_batch”,然后在Windows计划任务中添加一个任务:运行输入“taskschd.msc”,添加一个Task,General里输入名称,Triggers里执行时间,Actions里输入需要执行的“.ffs_batch”,这样就可以每天自动镜像同步了。

  2. 也许你已经发现10-11的方法存在的问题了:“C:\1001\”和“C:\Users\用户名\OneDrive”目录下,同时存在2份文件,这样白白浪费硬盘空间了!

解决方法是:在FreeFileSync批处理“.ffs_batch”中,可以设置同步完后执行命令,只需要在下图“Run a command”中输入:“cd C:\Users\用户名\OneDrive && attrib +U -P /s”,即可在同步完后释放本地Onedrive空间。

注意“&&”是两行命令的连接符号,FreeFileSync里只能输入一行命令,如果想输入两行命令,需要用“&&”连接符。

img

执行完这条命令,等OneDrive同步完成,查看OneDriver文件夹里的文件夹属性,可以发现文件夹Size很大,但Size on disk几乎没有,见下图。

img

讲一下这条命令的原理:执行上面的命令,实际上相当于在文件夹右键执行“Free up space”,这样被上传到OneDrive的文件,将全部从本地释放硬盘空间,当你要打开某个文件时,将自动从云端下载。

img

所有Free up space的文件/文件夹,都有一个云的图标,表示该文件只在云端存储。

img

另外,关于OneDrive图标含义,参见微软文档:OneDrive 图标的含义是什么? (microsoft.com)

img

\13. 关于第12条提到的Free up space是如何用命令实现的,我是查了很多资料后,在这两篇文章里发现的:

OneDrive Files On-Demand For The Enterprise - Microsoft Tech Community

PowerShell script to change OneDrive file attributescommunity.spiceworks.com/topic/2140825-powershell-script-to-change-onedrive-file-attributesimg

总结:

如果你是普通用户或文职人员,只需要把文件放在:

  • 桌面(C:\Users\用户名\Desktop)
  • 文档(C:\Users\用户名\Documents)
  • 图片(C:\Users\用户名\Pictures)
  • OneDrive目录(C:\Users\用户名\OneDrive)

img

除了第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)

posted @ 2023-05-15 10:58  Oraer  阅读(668)  评论(0编辑  收藏  举报