OneDrive同步本地任意文件夹

使用mklink命令创建OneDrive与博客Markdown文件夹的符号链接,实现同步的目的

为了能在其他设备上写博客,我曾经把整个文件夹扔到了OneDrive上,但是后来发现这样每次执行hexo cl && hexo g时都会产生大量的文件变动,对OneDrive服务器属实不太友好,毕竟一直在白嫖🐶。后来就只保留了./source/_posts文件夹,每次写完文章后手动复制粘贴过去。前几天突发奇想,能不能让OneDrive自动同步这个文件夹,搜了一圈就发现了mklink这个命令。

下面有一些关于`mklink`命令的说明,不想看的话直接点按钮跳过 跳过

mklink命令简介

命令简介引用了SS64以及Microsoft Docs的内容,参考了 逍遥峡谷 的文章,特此感谢

mklink命令用于创建目录或文件符号或硬链接,自Vista开始引入,支持Vista以后的Windows操作系统。

对比

mklink命令提供了三种链接方式,分别是符号链接硬链接以及联接,三种方式与快捷方式的对比如下

方式链接文件链接文件夹跨硬盘链接指向不存在的目标
快捷方式
硬链接
联接(目录交接点/软链接)
符号链接
  • 符号链接和联接是基于NTFS重解析点(NTFS reparse point)实现的
  • 硬链接是通过指向同一inode的多个文件表项实现的–与Unix硬链接相同。如果原始文件名被删除,硬链接仍将工作,它直接指向磁盘上的数据
  • 在一个循环中创建两个相互指向的链接,或者创建一个指向自身的链接是可行的(但不可取)。符号链接可能会在那些没有处理这些情况的应用程序中暴露出安全漏洞。
  • 符号链接和硬链接都不支持.zip压缩文件

语法

1
mklink [[/d] | [/h] | [/j]] <link> <target>
参数说明
/d创建目录符号链接。 默认情况下,此命令将创建文件符号链接。
/h创建硬链接而不是符号链接。
/j创建联接(目录交接点)。
<link>指定要创建的符号链接的名称。
<target>指定新符号链接引用的路径 (相对或绝对) 。
/?在命令提示符下显示帮助。

如果<link><target>路径中含有空格,则需要用双引号""包住内容

提权

默认情况下,运行命令mklink需要管理员权限。但是自Windows 10 build 14972起,如果开启了开发人员模式,则无需提权即可运行命令。

移动与选中

  • 在文件资源管理器中选中符号链接将会选中源文件(目录)
  • 在文件资源管理器中选中联接将会选中联接自身
  • 在文件资源管理器中拖拽符号链接到新的位置将只移动符号链接自身
  • 在文件资源管理器中拖拽联接到新的位置将会移动源文件目录到新的位置

演示

下面是我对每个类型所做的测试

更加详细的详细说明可以看 少数派 的文章,讲的非常明白

文件的符号链接

新建测试文件夹linktarget,新建测试文件./target/target.txt,此时link文件夹为空
文件的符号链接1
执行命令

1
mklink E:\Test\link\link.txt E:\Test\target\target.txt

此时link文件夹内出现了link.txt,文件类型为.symlink,图标与快捷方式相同,但它是符号链接。更改任一文件另一个文件也会被同步更改。符号链接指向的是源文件的路径,文件的真实存储位置仍然在./target/target.txt
文件的符号链接2

文件夹的符号链接

新建测试文件夹与target,新建测试文件./target/target.txt
文件夹的符号链接1
执行命令

1
mklink /d E:\Test\link E:\Test\target

此时会创建link文件夹,文件夹图标与快捷方式相同,文件夹内容与源文件夹相同。更改任一文件另一个文件也会被同步更改。
文件夹的符号链接2

符号链接指向的是源文件目录的路径,文件的真实存储位置仍然是target源文件夹,可以看到link文件夹在地址栏与标题栏的路径不同。
文件夹的符号链接3

文件的硬链接

新建测试文件夹linktarget,新建测试文件./target/target.txt,此时link文件夹为空
文件的硬链接1
执行命令

1
mklink /h E:\Test\link\link.txt E:\Test\target\target.txt

此时link文件夹内出现了link.txt,文件类型仍然为文本文档,与源文件相同。图标也是正常的文本文档图标。硬链接直接指向硬盘上的文件。
文件的硬链接2

联接(目录交接点)

新建测试文件夹与target,新建测试文件./target/target.txt
联接1
执行命令

1
mklink /j E:\Test\link E:\Test\target

结果与文件夹的符号链接基本相同,唯一的区别是link文件夹在地址栏与标题栏的路径相同。但是文件的真实存储位置仍然是target源文件夹。
联接2

OneDrive创建符号链接

首先打开OneDrive的设置,确认常规通知里面所有的项目已经勾选。
OneDrive设置
然后将博客的_posts文件夹剪切到OneDrive并重命名,注意是剪切,博客文件夹不能存在_posts文件夹。
然后按下win+s,输入cmd以管理员身份运行,然后输入mklink命令。注意mklink命令只能用cmd运行,powershell是不支持的。

1
mklink /d D:\Siriusq\source\_posts C:\Users\Sun\OneDrive\Siriusq

注意第一个路径是我博客文章的路径,第二个路径则是OneDrive的路径我博客文章的路径。这里其实是反着来的,OneDrive作为源文件夹,不然OneDrive会一直显示同步被挂起,很迷惑。

执行完毕后会有提示

1
为 D:\Siriusq\source\_posts <<===>> C:\Users\Sun\OneDrive\Siriusq 创建的符号链接

链接成功
链接成功后打开博客的文件夹可以看到,地址栏是当前文件夹的路径,而标题栏却是OneDrive文件夹的路径。此时无论修改哪一边的文件,另一边的文件也会跟着变化,达到同步的目的