Windows/NTFS中的几种符号链接
Linux下的符号链接相比大家都比较熟悉,然而Windows中的符号链接就很少被提起了。是的我说的是符号链接,不是快捷方式。
我最早是在Sublime Text的Package Control官方同步教程中发现了这种操作。为了在不同机器的Sublime软件中同步保存配置的User目录,Sublime官方给出了如下骚操作,对于Windows用户需要用管理员账户运行Powershell。
在第一个机器上将User目录转移到Dropbox网盘:
cd "$env:appdata\Sublime Text 3\Packages\"
mkdir $env:userprofile\Dropbox\Sublime
mv User $env:userprofile\Dropbox\Sublime\
cmd /c mklink /D User $env:userprofile\Dropbox\Sublime\User
在其他机器上合适位置创建该目录的符号链接:
cd "$env:appdata\Sublime Text 3\Packages\"
rmdir -recurse User
cmd /c mklink /D User $env:userprofile\Dropbox\Sublime\User
看到之后顿时觉得借助网盘和符号链接在多个电脑之间同步一些常用软件的配置文件还是很有用的,比如SS的用户定义规则一类的……
因此好好研究了一下Windows中的几种符号链接。
在command命令提示符窗口键入mklink可见命令说明:
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径(相对或绝对)。
我把各种操作都试了一遍,另外在Windows资源管理器中用右键快捷菜单创建了一个快捷方式:
可以发现除了硬链接以外,符号链接和目录联接在Windows资源管理器中的图标都是带有类似快捷方式的小箭头的,很难区分开。
在命令窗口中看下他们的属性:
总结一下,带上快捷方式,一共有四种link类型的对象:
创建方法 | 适用对象 | 箭头图标 | 显示大小 |
---|---|---|---|
快捷方式 | 文件/目录 | 有 | ink文件本身大小 |
mklink 无参数 | 文件 | 有 | 0 |
mklink /D | 目录 | 有 | 0 |
mklink /J | 目录 | 有 | 0 |
mklink /H | 文件 | 无 | 目标文件大小 |
符号链接(软链接)和硬链接的概念和Linux中是一样一样的。但是mklink还有一个Linux中没有的Junction,部分人是从Windows 7 / Vista 中系统分区下的 Users 和 Documents and Settings 文件夹中发现端倪的,因为这两个目录的内容总是相同的。
Junction是NTFS文件系统的特性,其实还是非常有用处的,可以用一个不占空间的空目录指向另一个实际位置的目录,可以用来解决一些实际问题,例如系统分区空间不足时将某些目录移动到其他分区而维持分区结构不变,也不需要重新分区。
那么创建一个目录联接点(/J)和目录的符号链接(/D)有什么区别呢?
- /D 创建目录符号链接,Link可以像普通目录一样复制、移动。Target 可以使用相对路径时,如果使用相对路径,Link和Target没有同时移动,将无法找到 Target。
- /J 创建目录联接点,Link不可以像普通目录一样复制、移动。Target 使用相对路径时,会自动补全为绝对路径。
此外,目录符号链接还可以指定 SMB 远程网络中的路径,而目录联接点不可以。
在使用mklink命令时有一个不便之处,该命令只能在command命令提示符窗口中使用,PowerShell 中没有 mklink 命令。
如果要在 powershell 中使用 mklink,那么得先敲 cmd 进入 cmd 之后再使用 mklink 命令。在powershell中偶尔使用一下的话,可以用 cmd/c 或者 cmd/k 后接命令。
使用 mklink命令偶尔也会遇到权限问题,最简单的解决方法是使用管理员运行cmd命令。
参考资料
腾讯云社区|walterlv - 吕毅的博客|解决 mklink 使用中的各种坑(硬链接,软链接/符号链接,目录链接)
本文固定链接: https://blog.xieyc.com/symlinks-in-win-ntfs/ | 小谢的小站