mklink 命令详解
在命令提示符中输入 mklink 可以查看相关的运行命令。
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。
Link 跟 Target 很容易理解,Link 就是要链接的文件夹/文件的路径,Target 就是源文件夹/源文件的路径。
路径可以是绝对路径或者相对路径:
比如:
# 相对路径
mklink /D b a
# 绝对路径
mklink /D E:\mklinkDemo\b E:\mklinkDemo\a
# 等于
mklink /D "E:\mklinkDemo\b" "E:\mklinkDemo\a"
如果不是以
.
字符开头的路径或者是没有携带子路径可以不携带 “”,但是存在.
字符的相对路径一定要携带,否则会报错。
这里的相对路径指的是相对于源文件夹的路径,如果要给源文件夹设置相对路径,只能是当前目录下的存在的文件夹(比如说上面的 mklinkDemo 下的 a),如果携带了 .
字符(比如 mklink /D b './a'
),创建的链接文件夹无法找到源文件夹,访问的话会提示无法访问。
相对路径的用法是针对创建的链接文件夹相对于源文件夹的(必须要是绝对路径,当前的目录下的是特例(上面的 mklink /D b a
命令))
# 相对路径
mklink /D "../b" E:\mklinkDemo\a
详细介绍一下上面的标识符:
-
/D
:创建的是目录符号链接(符号链接又被称为软链接),假设我们想操作的文件夹中存在以下的结构:
我们想创建一个符号链接 b,指向文件夹 a,可以使用以下命令
mklink /D b a
此时可以看到目录结构为:
如果我们在文件夹中查看,可以发现文件夹 b 的图标带了一个箭头,跟创建快捷方式一样。
查看文件夹 b 的属性,可以发现它确实指向了文件夹 a:
需要注意的是,虽然看起来新创建的文件夹 b 占用了 12 kb 的内存,但是实际上它在系统中是不占内存中,显示的只是文件夹 a 的占用内存。
此时我们删除、移动、重命名源文件夹 a,会发现 b 无法打开,也无法查看文件夹属性(说明它确实只是一个链接指向 a,a 被删除、移动、重命名后,b 就没办法操作(读取、新建文件))。删除链接文件夹则不会影响到源文件夹。
如果我们删除的是源文件夹中的文件,那么链接文件夹中的对应的文件同样会被删除。反过来也是一样,如果我们删除的是链接文件夹中的文件,同样会反映到源文件夹上。
这个标识符可以跨本地磁盘,在跨磁盘的就需要使用绝对路径了:
mklink /D C:\mklink E:\mklinkDeme\a
创建符号链接是需要管理员权限,如果我们没有以管理员身份运行会提示
你没有足够权限执行此操作
。此时可以选择使用管理员身份重新运行命令提示符,或者在本地安全策略(在运行中输入secpol.msc
打开)\本地策略\用户权限分配\创建符号链接\添加用户。 -
无标识符:创建的是文件符号链接。
继续上面的目录结构,我们携带 /D 标识符去创建文件符号链接试试看,在目录 a 下执行mklink /D new.txt index.txt
看似成功了但是我们查看生成的东西就会发现它生成的是一个文件夹(index.txt)而不是我们想要的 index.txt 文件。记住, /D 是创建目录的
去掉 /D 标识符重新运行试试,我们看看会是什么结果:
生成的文件类型为 .symlink 类型,图标同样存在箭头标识。默认情况下,能够生成目标路径文件快捷链接。删除文件或将当前目标指向为文件夹,链接文件都将失效。
同样可以跨本地磁盘,在跨磁盘的就需要使用绝对路径了:
mklink D:\index.txt E:\mklinkDemo\a\index.txt
-
/H:创建的是硬链接,只能操作文件,不能操作文件夹。作用与符号链接类似,相当于直接作为文件目录的另一个入口,删除该文件,原始文件并不会被同时删除,看起来像一个文件副本。创建硬连接执行指令和参数并不需要管理权限执行。
在文件夹 a 下执行
mklink /H new.txt index.txt
:可以看到此时图标中没有携带箭头标识,new.txt 文件也不是 symlink 类型。而且当前文件与源文件大小一致。删除源文件,生成的新文件照样可以访问。由此可知,两个文件类似文件的入口指针,生成一个及其以上的硬链接时,删除源文件,并不能将其从内存中真正的删除,而是需要将对应的所有硬链接都删除。
使用了这个标识符后不能跨磁盘:
-
/J:创建目录联接,也属于软链接。虽然它的表现基本跟 /D 一样(像修改文件会反映到另一个文件上等等)。不过跟 /D 有一个很明显的区别,就是通过鼠标拖动把链接文件夹移动到其他位置时,会把源文件中全部文件全部删除掉,只存在于移动的新位置里。此时链接文件夹还是存在的,不过里边没有任何文件。而通过 move 命令则是会把整个链接文件夹都移动到新位置,就不会对原文件夹中的文件产生影响。
使用了这个标识符后可以跨磁盘: