前两天看到读者留言说windows下有个命令mklink可以试试。这个命令我之前的确没用过,试过之后发现原来windows下也有软链接和硬链接之分。
Linux 中的软链接使用的比较多,一般当成快捷方式用、特别是比较深的目录。
创建软链接可以方便 cd 到不同目录,同时也不会造成误解,软链接在显示上会高亮比较明显。删除软链接也不会造成任何不好的后果,并且是可追溯的,可以查看软链接指向的目录或文件。
硬链接一般情况不要使用,因为它无法追溯。你修改了一个硬链接的文件内容,同时会影响的所以指向该文件的硬链接。相当于一个文件有不同的文件名,但它们都指向同一个文件,并且还很难查看它们直接的关系。没有一张图会告诉你哪些文件是相互关联的。
软链接可以随便用,硬链接最好做了登记后再用,不然会造成意外后果。软链接可以用于文件或目录,硬链接只能用于文件不能用于目录,且无法跨文件系统。
Windows 下的软链接和硬链接与Linux类似,但大家用的很少。因为图形界面操作一般使用快捷方式就够了。
但快捷方式实际上是个二进制文件(*.link),它只能被图形化管理工具读取。
软连接一般用于命令行或脚本中,快捷方式对命令行环境没有帮助。
Windows 下可以使用 mklnk 命令创建软链接。它的帮助文档为:
C:UsersAdministrator>mklink /?
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。
C:UsersAdministrator>
mklink /d gitrepo d:gitRepo
在 windows 图形界面下软链接看起来像一个快捷方式:
但在文件上它们属于不同的文件,快捷方式在文件上是个二进制文件,软链接不是。我创建了一个快捷方式和一个软链接,两个文件放一起可以比较一下。
我们使用 /d 和 /h 就行了,/d 可以指向文件和目录,/h 只能指向文件且限定盘符只有在一个盘才能用和 linux 的规则一致。
/j 在文档上与 /d 有区别,但实际测试没有分别,它是 windows 早期版本的一种实现,在 win10的行为 上与 /d 表现一致可以不用记。
mklink 创建的软链接在 git-bash 中也能用,但 mklink 只能在 cmd 中使用。原因是 mklink 不是一个可执行文件,使用 where 和 everything 是找不到实体文件的。它和 cmd 中的 cd、type 命令有点像,类似 shell 中的内置函数。
推荐使用软链接,尽量不用硬链接。软链接基本搞清楚了,那如何在命令行创建快捷方式?DeepSeek 给出了一种实现:
$ cat /c/bin/CreateShortcut.vbs
Set ws = WScript.CreateObject("WScript.Shell")
Set sc = ws.CreateShortcut(WScript.Arguments(0))
sc.TargetPath = WScript.Arguments(1)
sc.Save
$ cat /c/bin/myln.bat
cscript //nologo "c:binCreateShortcut.vbs" "%1" "%2"
c:binmyln.bat "快捷方式.lnk" d:gitRepo
原文始发于微信公众号(生有可恋):Windows 中的软链接和硬链接
评论