使用 LinkShellExtension 简化 Windows 文件链接
简化 Windows 文件链接
使用命令行方式对文件链接进行操作繁琐又危险, 且极难进行大量的文件对象操作, 当涉及复制与移动时候更为地狱.
ln(可选)
ln 作为 LinkShellExtension 的命令行扩展, 提供额外的数据分析. 官方网站.
下边提供 ln 的 ui 操作替代代码
LinkShellExtension
在 Windows-文件链接 中仅使用到了该工具的标记功能, 在此对这个工具的基本功能做简要记述以及对官方一些蛋疼的描述做优化并记录. 官方网站.
为美观下文将工作称为 LSE.
语义对照表
LSE 在文档以及本地化上存在较为模糊的情况, 因此在这里给出个人理解的版本:
本地化 | 英文 | 实际语义 | 支持文件 | 支持目录 | 归属类别 |
---|---|---|---|---|---|
硬连接 | Hardlink | 硬链接 | ✅ | ❌ | 菜单项 |
符号连接 | Symbolic Link | 符号链接 | ✅ | ✅ | 菜单项 |
目录连接点 | Junction | 目录链接 | ❌ | ✅ | 菜单项 |
智能副本 | Smart Copy | 智能复制 | ❌ | ✅ | 菜单项 |
智能镜像 | Smart Mirror | 智能镜像 | ❌ | ✅ | 菜单项 |
硬连接副本 | Hardlink Clone | 硬链接克隆 | ❌ | ✅ | 菜单项 |
符号连接副本 | Symbolic Clone | 符号链接克隆 | ❌ | ✅ | 菜单项 |
多版本智能副本 | DeLorean Copy | 多版智能复制 | ❌ | ✅ | 菜单项 |
行动键 | Action Button | 鼠标次要按钮 | ? | ? | 鼠标动作 |
截断连接 | Crop | 跳过链接创建 | ? | ? | 配置 |
创建副本 | Unroll | 展开并复制文件对象 | ? | ? | 配置 |
连接原文件 | Splice | 链接原文件 | ? | ? | 配置 |
LSE 的基本使用要素
使用方式
LSE 的使用方式为:
- 右键 文件或者目录 作为 Target, 并选中 选择源连接点( Pick Link Source )
- 在资源管理器的 空白处 或者 父目录 右键 创建为..(Drop AS…)
- 根据类别选择二级菜单选项
与命令行的映射
命令行的链接方式与 LSE 存在以下对应:
类别 | 命令行 | LSE | LSE(en) |
---|---|---|---|
符号链接 | mklink (/d){0,1} <Link> <Target> | 符号连接 | Symbolic Links |
目录链接 | mklink /j <Link> <Target> | 目录连接点 | Junction |
硬链接 | mklink /h <Link> <Target> | 硬连接 | HardLink |
相对与绝对路径
创建的路径格式在 LSEConfig.exe 的 常规配置 - 创建符号链接的方式 - 绝对路径|相对路径 更改. 这项配置仅作为优先配置, 在某些情况下 LSE 会选择使用绝对路径形式, 比如跨盘符链接.
LSE 进阶使用
当涉及大量文件/目录操作时候, LSE 可以提供极大便利. 但官网对这些进阶功能描述并不尽人意, 因此我在此用”人话”与”正常人思路”抽象做记录.
智能复制(Smart Copy)
Smart Copy creates a copy of the directory structure from the source location to the destination, but it preserves the inner hardlink structure and inner junction/symbolic link relations of the source, and recreates this inner hardlink structure and inner junction/symbolic link relation at the destination location.
这段话有如下提要:
- 该功能在 Target 为 文件夹 时候适用
- LSE 提供对 Windows 的复制做了扩展
- LSE 尽量复刻源文件夹内的 符号链接/目录链接/硬链接 的结构
- 结构的复刻是通过再现 创建动作 实现的
当源文件夹内的链接与源文件夹外存在链接, 就有了以下的处理工作.
硬链接的额外处理
- 复制出来的新硬链接表是源链接表的克隆, 是新对象
- 新硬链接表重建的过程中, 遇到不存在的对象则丢弃, 表现为计数减 1 , 当计数为 0 降级为普通文件
使用以下内容创建树结构:1
2
3
4
5
6
7
8
9
10
11
12
13chcp 65001
md HARD
md HARD\0
md HARD\0\1
echo T0 > HARD\T0.txt
mklink /h HARD\0\T0的第一份硬链接.txt HARD\T0.txt
mklink /h HARD\0\1\T0的第二份硬链接.txt HARD\T0.txt
echo T1 > HARD\T1.txt
mklink /h HARD\0\T1的第一份硬链接.txt HARD\T1.txt
pause
对文件夹 0 在 HARD-out 中 创建智能副本(智能复制)或者使用下边的 ln 代码
1
2
3
4ln -c HARD\0 HARD-out\0
:end
pause
结果:
符号(目录)链接的额外处理
当存在符号/目录链接时, 存在三种策略:
- 丢弃: 该符号链接在复制中被略去, 结果为未有新符号链接的创建
- 展开: 复制原有的 Target 指向的文件对象, 成为一个普通文件. 同时遵守 硬链接的额外处理
- 粘接: 新的符号链接指向原有的 Target 指向的文件对象 ( Target 值此时可能会重新计算, 或从相对路径变为绝对路径)
使用以下内容创建树结构:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17:soft_tree_step1_create.bat
@echo off
@chcp 65001
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & goto end)
cd /d %~dp0
md SYMBOL
md SYMBOL\0
md SYMBOL\0\1
echo T0 > SYMBOL\T0.txt
mklink SYMBOL\0\T0的相对链接.txt ..\T0.txt
echo T1 > SYMBOL\0\T1.txt
mklink SYMBOL\0\1\T1的相对链接.txt ..\T1.txt
:end
pause
对文件夹 SYMBOL\0 在 SYMBOL-out 中 以不同设置创建智能副本(智能复制), 或者或者使用下边的 ln 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17:soft_tree_step2_copy.bat
@echo off
@chcp 65001
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & goto end)
cd /d %~dp0
:: 丢弃
ln --crop -c SYMBOL\0\ SYMBOL-out\crop\0
:: 展开
ln --unroll -c SYMBOL\0 SYMBOL-out\unroll\0
:: 粘接
ln --splice -c SYMBOL\0 SYMBOL-out\splice\0
:end
pause
结果:
智能镜像(Smart Mirror)
Smart Mirror is very similar to Smart Copy and not only copies but synchronises the folder Source to Destination:
Smart Mirror copies if the timestamp of items in the Destination is different from the Source.
Delete files not anymore available in Source from Destination.
Smart Mirror takes care of Hardlink Relations, Restores Inner Junctions or Inner Symbolic links or when issued unrolls or splices Outer Junctions or Outer Symbolic Links.
这段话有如下提要:
- 提供与 智能复制 一样的功能
- 提供额外的同步操作(手动触发)
- 可以重复在目标上调用以实现同步
- 文件的时间戳不一致, 以源文件覆盖目标文件
- 不存在于源的文件将会被删除
注: 实际应用仅为实现备份源文件夹, 并提供手动同步状态到触发时源文件夹的状态而不用手动执行修改目标文件夹.
智能移动(Smart Move)
Smart Move enables folders with junctions and symbolic links beneath to be renamed. The junctions and symbolic links’ targets are updated below that folder. Without Smart Move renaming of such folders would end in dead junctions and symbolic links.
- 智能移动并不提供菜单项, 而是通过拦截资源管理器的文件夹移动操作实现
- 由文件链接规则可知: 该功能不应用到硬链接上
- 智能移动不维护 外部符号链接 与 外部目录 链接, 这与 智能复制 表现不一致
注: 在编程中, 重命名等于移动操作
使用以下内容创建树结构:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15:smart_move_create.bat
chcp 65001
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & goto end)
cd /d %~dp0
md mov
md mov\0
md mov\0\1
md mov\0\1\2
echo T0 > mov\T0.txt
mklink mov\0\T0的链接.txt ..\T0.txt
echo T1 > mov\0\1\2\T1.txt
mklink mov\0\1\T1的链接.txt .\2\T1.txt
:end
pause
对 0 文件夹重命名 为 00, 可以预期 4 个文档都可以正常工作:
将 00 文件夹移动到 mov 的同级目录 mov-out 下, 可以预期 T0的链接.txt 此时无法工作(规则3):
硬链接克隆(Hardlink Clone)
Clones are copies of a folder tree from a source location recreated at the destination location, however the files within the new folder tree are Hardlinks or Symbolic Links to the respective files in the source folder tree.
官方把两个菜单选项统一归类到了 Clone 一节, 实际使用中仍旧需要区分.
以下的链接包括 符号链接 与目录链接.
硬链接克隆的流程:
- 过滤外部链接
- 过滤内部链接
- 将过滤之后的文件列表结构以硬链接的形式复制结构到目标文件夹中, 产生的各个文件是硬链接形式
- 处理被过滤内部链接, 在目标文件夹中重新构建源文件夹的内链接关系
- 处理被外部链接, 根据配置使用以下规则:
- 使用截断连接(Crop): 放弃处理
- 使用创建副本(Unroll): 使用原链接的 Target 在目标文件中创建对应的链接
- 使用粘接(Splice): 使用 原链接的 Target 在目标文件中创建对应的链接
以下是原始数据
与三种不同方式克隆目录 Clone\0 之后的结果:
符号链接克隆(Symbolic Clone)
以下的链接包括 符号链接 与目录链接. \
符号链接克隆的流程:
- 过滤外部链接
- 过滤内部链接
- 将过滤之后的文件列表结构以链接的形式复制结构到目标文件夹中, 产生的各个文件是链接形式
- 处理被过滤内部链接, 在目标文件夹中重新构建源文件夹的内链接关系
- 处理被外部链接, 根据配置使用以下规则:
- 使用截断连接(Crop): 放弃处理
- 使用创建副本(Unroll): 使用原链接作为 Target 在目标文件中创建对应的链接
- 使用粘接(Splice): 使用 原链接 的 Target 作为 Target 在目标文件中创建对应的链接
以种不同方式克隆目录 Clone\0 之后的结果: