win10下使用mklink命令给C盘软件搬家
在windows下,大多数软件会默认安装在C盘,即使小心翼翼地点开“自定义”->“安装路径”,然后把软件安装到其他盘,还是会有很多软件用到的数据文件被塞到C盘,虽然可以到注册表修改软件默认安装路径以及数据存储路径,然而emmm...并没有多大用处,C盘还是会被塞满。
我C盘是SanDisk的SSD,虽然128G不算少,但是我分了十多G给PrimoCache做缓存,然后又装了很多很多的软件,C盘被塞得满满当当的,这时候需要把C盘上一些文件搬到其他盘。然而C盘大都是软件会用到的数据文件,直接Ctrl+X,Ctrl+V的话会出现很多问题,那么可不可以在搬家后给原来的路径搞个“代理”,把路径指向文件的实际地址?如下图所示:
接下来我们就试验下吧,先试着用快捷方式来实现搬家:
我这里把迅雷安装路径下整个文件夹剪切出来,然后在原来路径下放个快捷方式,然后双击桌面上的迅雷快捷方式,成功启动,并没有啥不妥,接下来换个方式:
把迅雷中的resources文件夹剪切出来,然后把快捷方式放进去,然后启动迅雷,emmm。。迅雷打不开了。
为什么会出现这样的问题,很简单,第一次操作是把迅雷整个文件夹剪切出来的,这个文件夹包含了迅雷运行的所需要的所有文件,第二次操作时,迅雷的程序找不到resources里面的文件,所以就运行不起来了,那为什么把快捷方式放这里没有用呢。 其实是因为快捷方式本质是个.ink文件,虽然我们在资源浏览器双击这个快捷方式,可以显示这个快捷方式指向的文件或文件夹,但是迅雷以及其它软件会直接把这个快捷方式当做.ink文件对待,不能访问到快捷方式指向的文件夹。因此不能简单地使用快捷方式进行软件搬家。
想要安全转移文件,就需要用到mklink命令,命令格式如下:
硬链接
mklink [/h] "link" "target"
通过上述命令就可以创建从“link”路径到“target”路径的硬链接,例如在D盘根目录下新建文本“A.txt”,然后输入命令如下即可创建到"A.txt"的硬链接"B.txt":
注意:因为powershell不支持mklink命令,所以要在前面加cmd /c表示用cmd来运行该命令,路径注意引号,可以是相对路径也可以是绝对路径,硬链接只能用于文件,不能对文件夹创建硬链接,不然会提示“拒绝访问”。
在文件资源管理器上看,“B.txt”与“A.txt”占用同样大小的空间,其实这个数据并不用去理会,硬链接相当于给文件的数据多创建了一个“入口”,“A.txt”,“B.txt”指向的是硬盘中的同一块区域,因此这两个文件的内容是完全一样的,编辑任何一个文件都会影响到另一文件,当删除其中一个文件,只是删除这个文件其中一个“入口”,要两个文件都删除,文件系统才会标志这块硬盘区域上的文件被删除。
符号链接
对文件创建符号链接
mklink "link" "target"
对文件夹创建符号链接
mklink /D "link" "target"
符号链接是在文件系统上实现的链接,对操作系统上大多数软件来说是透明的,也就是说,当软件访问符号链接时,其实际上是在访问该符号链接所指向的文件(夹),再次拿迅雷做例子,先把迅雷的resource文件夹剪切到D盘根目录,然后在原来路径建立符号链接:
注意:软链接的创建需要管理员权限,确保cmd是管理员模式。对于文件夹的软链接创建,一定要加上"/D"。通过相对路径创建的软链接在移动后无法使用,绝对路径创建的移动后不影响使用。符号链接可以直接右键删除,或通过rmdir命令删除,不会影响原文件,但del命令则会把目标文件删除。
创建的符号链接显示的类型是文件夹,实际上相当于是指向D盘真实的resource路径的快捷方式,符号链接本身不占空间。 路径映射的过程对迅雷来说是透明的,迅雷对这个符号链接的操作实际上是对resource文件夹的操作,因此迅雷可以正常运行。 另外,符号链接和目录联接是有快捷方式的那个箭头的,只不过我修改了注册表所以这里不显示。 符号链接与Linux下的软链接很相似,因此网上很多资料都会把ntfs的符号链接叫做软链接。 此外,符号链接还可以连接远程的路径,命令如下:
mklink /D "D:\link" "\\123.123.0.1\D$\target"
目录联接
“目录联接”只能应用于文件夹,不可用于文件。 根据网上能找到的资料显示,对文件夹创建的“目录联接”与“符号链接”并没有区别,一样可以实现软件数据的迁移。不过貌似这两者对剪切操作有不一样的表现。
例如,我现在在D盘创建“文件夹A”, 在“文件夹A”里新建A.txt,然后在D盘根目录创建一个“目录联接B”指向这个“文件夹A”,通过这个“目录联接B”,我可以访问到A.txt; 接着我对“目录联接B”进行剪切操作,剪切到其它地方(C盘),发现“文件夹A”和“目录联接B”还是在D盘,即原来的地方,但是打开却发现A.txt不见了,被剪切到了C盘的“文件夹B”中,也就是说对“目录联接”的剪切操作会影响原来的文件。
对于这其中的机制,找了很多资料都没提到这个问题,到stackoverflow提问又没人回答。。。 感觉“目录联接”跟“符号链接”有点像,给文件夹里的内容提供一个“入口”即所谓的“联接点”,剪切操作时会通过这个“联接点”把内容剪切出来,原来的目录和“联接点”虽然没有变化,但里面的内容被剪切出来了。 而“符号链接”的剪切操作仅仅是对这个“符号链接”的剪切,并不会透过这个“符号链接”把其内容剪切掉。
以上描述可能稍微有点乱,最好还是亲自试验一下。
数据迁移
用Disk Space Fan 4对C盘进行扫描,发现Adobe的数据文件占用了1G多的空间,而这些数据根本用不着放固态浪费空间,于是可以把这个文件夹剪切到D盘合适路径下,这个路径由自己决定,放哪都可以。 因为这个文件夹放在“C:ProgramData”,为了方便管理我在D盘也新建了ProgramData文件夹,然后把Adobe这个文件夹剪切过来。 期间需要对文件夹的权限做下处理,因为部分软件对文件夹设了权限,只有赋予了权限才能移动、编辑文件夹。 需要注意的是,在移动文件时要先把软件相关的进程和服务关闭。 文件传输结束后输入命令:
mklink /d "C:\ProgramData\Adobe" "D:\ProgramData\Adobe"
以上例子只是方便理解,实际操作不太推荐使用剪切,而应该把文件夹复制过去,没问题了再把原来文件删除,避免数据丢失,数据无价,谨慎操作。
使用 “NTFSLinksView” 这个软件可以查看系统中的符号链接和目录联接,Symbolic Link就是符号链接,Junction是目录联接。win10下很多地方都使用的Junction,例如“开始菜单”,“我的文档”这些目录。