• 【SymbolicLink】利用软连接将已安装程序搬迁到其他盘符


    0x00 前言

    一个基于 Sybmolic Link 的很有意思的解决方案: mklink /D
    可用于将安装版的程序目录迁移到其他位置,以腾出硬盘空间。
    例如,把游戏安装到 C 盘,之后想挪到 D 盘去,假如直接剪切,会带来复杂的文件依赖问题。

    简单来说,陪伴我快 7 年了的笔记本,它的磁盘空间不怎么够。
    C 盘有个模拟器,连程序带数据一起 17.9G,我给他剪切到 D 盘去。
    现在几个盘均衡负载啦,看起来都还不错 ~
    但是,无论是点桌面上的模拟器快捷方式、或是在 D 盘找到模拟器的 exe 文件打开,
    都会报错 —— “有文件找不到”。
    在这里插入图片描述

    0x01 原理解释

    我们会有这样一种经验:
    很多程序,我们把整个文件夹剪切到其他地方之后,虽然一个文件都没少,就是没法用了。
    这其实是因为,很多通过安装包安装的程序,通常使用绝对路径来定义每个资源应该去哪个位置获取。
    例如 C:/abc/Emulator.exe,我们把 abc 文件夹挪到 D 盘,但这个路径却不会跟着我们的剪切而变化。
    这样一来,程序执行中需要找资源的时候,路径所对应的位置却什么都找不到。

    我们平日里见到的“绿色版”的程序其实就是这些路径由相对路径来定义。
    例如 当前目录/bin/emulator.exe,所以文件夹在哪,不影响程序在这个 当前目录 找到对应的资源。

    0x02 解决方案

    在 Linux 里,有一个特别好用的办法叫做 soft link。
    可以理解为呼叫转移,我们把手机号 DEST 呼叫转移给 SRC,这样我们给这两个号码打电话的时候其实都是在给 SRC 打,我需要 DEST/abc.txt 的时候,机器会自动把 SRC/abc.txt 给我。
    这个操作在 linux 里可以写为 ln -s
    例如 ln -s /home/chendian /home/chend,可以解决在不同机器上名字不同,但又不想改 path 的问题。

    但在 Windows 里,用 git bash 来这样操作,却是不行的。
    我们可以发现,SRC 和 DEST 虽然连接起来了,但他们俩都占用了 17.9G 的空间,
    看来 Windows 的事,还是得交给命令行,去查阅了一些资料,这种方案是完美而有效的:
    mklink /D ,例如 mklink /D "C:\Program Files\MuMu" "D:\MuMu"

    完整的操作过程如下所示:

    • C 盘的原有一个目录 MuMu 占用空间 17.9G,
    • MuMu 被剪切到 D 盘,C 盘没有 MuMu 文件夹了,桌面上 MuMu.exe 的快捷方式用不了了
    • mklink /D "C:\Program Files\MuMu" "D:\MuMu"
    • C 盘出现一个 MuMu 占用空间 0
    • D 盘的 MuMu 占用空间 17.9G
    • 桌面、开始菜单里的快捷方式都可以无知觉地继续正常工作

    0x03 延伸阅读

    关于 symlink 的介绍,这篇我觉得写的很好,摘抄一下。
    reference: https://blog.51cto.com/u_15449929/4764192

    符号链接(Symlink,Softlink)
    是对文件或目录的引用,实际上符号链接本身是一个“记录着所引用文件或目录的绝对或相对路径”的特殊文件,通过符号链接的操作都会被重定向到目标文件或目录。对符号链接和快捷方式的“读、写、遍历”等操作都会被重定向到目标文件或目录,但对它们的“复制、删除、移动、配置 ACL”等操作只针对自身。

    同时适用于文件、目录。这是一种超级shortcut,文件大小为0字节和不占用空间。

    可以使用相对、绝对路径。假设创建symbolic link时使用了相对路径,保存到NTFS中的就是相对路径,不会隐式转换成绝对路径。

    可以跨盘符,可以跨主机,可以使用UNC路径、网络驱动器。

    在Explorer中删除symboliclink,不影响target。

    删除target,symboliclink仍将存在,但失效了,变得不可用。

    文件类型是.SYMLINK

    它们可以像普通文件一样操作,但所有对符号链接的操作都实际作用于目标对象。符号链接对用户而言是透明的,符号链接看上去和普通的文件和文件夹没有区别,操作方法也一模一样。

    对符号链接和快捷方式的“读、写、遍历”等操作都会被重定向到目标文件或目录,但对它们的“复制、删除、移动、配置 ACL”等操作只针对自身,符号链接不但可以应用于本地系统,还可以应用 UNC 路径。

    创建符号链接不仅可以当作快捷方式使用,最重要的是重定向链接符可以被程序读取然后重定向真正的位置,这是快捷方式无法做到的。

    0xFF 实际效果演示

    这个指令是在命令行中使用的,
    所以我们需要先使用管理员权限打开 CMD:

    在这里插入图片描述

    本例中:
    “D:\MuMu” 是 17.9G 的目录,是源文件夹
    “C:\Program Files\MuMu” 是 0B 大小的 SymLink,是生成的链接文件夹

    C:\Program Files>mklink /D "C:\Program Files\MuMu" "D:\MuMu"
    为 C:\Program Files\MuMu <<===>> D:\MuMu 创建的符号链接
    
    C:\Program Files>dir
     驱动器 C 中的卷是 System
     卷的序列号是 787D-CF6D
    
     C:\Program Files 的目录
    
    2022/08/05  13:16    <DIR>          .
    2022/08/05  13:16    <DIR>          ..
    2022/05/24  15:56    <DIR>          Lenovo
    2022/03/06  15:09    <DIR>          Mendeley Reference Manager
    2022/08/05  13:16    <SYMLINKD>     MuMu [D:\MuMu]
    2022/06/03  23:31    <DIR>          NVIDIA Corporation
    2021/04/11  22:41    <DIR>          TENCENT
    2016/04/02  09:48    <DIR>          ThinkPad
                   0 个文件              0 字节
                  61 个目录 25,995,014,144 可用字节
    
    C:\Program Files>cd MuMu
    
    C:\Program Files\MuMu>dir
     驱动器 C 中的卷是 System
     卷的序列号是 787D-CF6D
    
     C:\Program Files\MuMu 的目录
    
    2022/08/05  12:41    <DIR>          .
    2022/08/05  12:41    <DIR>          ..
    2022/08/05  12:41    <DIR>          emulator
                   0 个文件              0 字节
                   3 个目录 46,871,433,216 可用字节
    
    C:\Program Files\MuMu>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    资源管理器里看起来依然是一个快捷方式的样子
    但在上文中我们知道,这并不是快捷方式的 MuMu.lnk 文件,而是 SYMLINKD 格式的。
    2022/08/05 13:16 MuMu [D:\MuMu]

    在这里插入图片描述

  • 相关阅读:
    基于字节码的统一异常上报实践
    新 树莓派4B 温湿度监测 基于debian12的树莓派OS
    完成学校官网页面制作
    面试求职-简历编写技巧
    Redis-数据类型-List
    Intellij IDEA--导入导出配置
    [计算机毕业设计]远程监督的跨语言实体关系抽取
    MySQL之JDBC编程
    带你走进不一样的策略模式
    【vim 学习系列文章 12 -- vimrc 那点事】
  • 原文地址:https://blog.csdn.net/okcd00/article/details/126175796