# link_move **Repository Path**: ming_log/link_move ## Basic Information - **Project Name**: link_move - **Description**: link_move 是一个 Windows 命令行工具,用于将一个或多个目录安全迁移到目标位置,并在原路径创建符号链接。它采用先复制、再校验、后删除源目录的流程,支持并行任务、失败回退、进度显示和详细错误诊断,适合迁移配置、缓存、IDE 或工具数据目录。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-25 - **Last Updated**: 2026-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # link_move `link_move` 是一个 Windows 命令行工具,用于把一个或多个目录移动到新的父目录下,并在原路径创建符号链接。 它的实际流程是: ```text 复制源目录 -> 校验复制结果 -> 删除源目录 -> 创建符号链接 ``` 相比直接 `Move-Item`,这个流程更适合迁移配置目录、缓存目录、IDE 数据目录、AI 工具数据目录等重要目录。 ## 适用场景 - 最常见的使用场景,清理C盘空间,可以在不影响原始程序的使用情况下,无痛迁移文件。 - 把用户目录下的大型配置目录迁移到其他磁盘。 - 把 IDE、编辑器、AI 工具、模拟器等数据目录迁移到数据盘。 - 保持原路径可用,让原程序继续通过符号链接访问新位置。 示例: ```powershell link_move .\.codex D:\VibeCodingIDEData link_move .\.cursor .\.vscode D:\VibeCodingIDEData -t 2 ``` ## 安全机制 `link_move` 会尽量避免在复制失败时破坏源目录: - 先复制目录,复制完成后再校验。 - 校验通过后才删除源目录。 - 删除源目录后,在原路径创建指向新目录的符号链接。 - 如果复制或校验失败,会删除已经复制出来的目标副本,并保留源目录。 - 如果某个任务失败,不会影响其他任务继续执行。 - 如果目标路径已经存在,会拒绝覆盖。 - 如果源目录已经是符号链接或重解析点,会拒绝执行。 ## 安装 仓库中已经包含构建脚本和安装脚本。 构建: ```powershell .\build.ps1 ``` 构建产物会生成到: ```text bin\link_move.exe ``` 安装到当前用户的本地 bin 目录: ```powershell .\install.ps1 -Build ``` 默认安装位置: ```text %USERPROFILE%\.local\bin\link_move.exe ``` 确保该目录已经加入 `PATH` 后,可以直接运行: ```powershell link_move -h ``` ## 用法 ```powershell link_move [选项] ... link_move ... [选项] ``` 最后一个路径参数始终是目标父目录,前面的路径都是源目录。 ### 移动单个目录 ```powershell link_move C:\Users\ming\.codex D:\VibeCodingIDEData ``` 结果: ```text D:\VibeCodingIDEData\.codex 真实目录 C:\Users\ming\.codex 指向新目录的符号链接 ``` ### 一次移动多个目录 ```powershell link_move .\.codex .\.cursor .\.vscode D:\VibeCodingIDEData ``` ### 使用通配符移动多个目录 源目录支持 `*` 和 `?` 通配符,只匹配直接子目录,不匹配文件。 ```powershell link_move D:\Local\* F:\AppData\Local ``` 上面的命令会把 `D:\Local` 下的所有直接子文件夹移动到 `F:\AppData\Local`,并在每个原路径创建符号链接。 ```powershell link_move * F:\AppData\Local ``` 上面的命令会匹配当前目录下的所有直接子文件夹。 ### 指定并行数 注意并行数不宜设置过大,特别是在单硬盘场景下,设置得过大反而会导致任务之前产生竞争,使得整体任务耗时更长,单硬盘建议设置为2。如果是多硬盘场景下,可设置得高一点,建议设置为5。 ```powershell link_move -t 3 .\.codex .\.cursor .\.vscode D:\VibeCodingIDEData ``` 也可以把 `-t` 放到命令最后: ```powershell link_move .\.codex .\.cursor .\.vscode D:\VibeCodingIDEData -t 3 ``` ### 查看帮助 ```powershell link_move -h link_move --help ``` ## 选项 | 选项 | 说明 | | --- | --- | | `-t <并行数>` | 指定多个源目录之间的并行数,默认是 `1`。 | | `--thread <并行数>` | 与 `-t` 相同。 | | `-h` | 显示帮助。 | | `--help` | 显示帮助。 | ## 进度输出 执行时会显示固定列宽的任务进度表: ```text tttt1 [ ] 0% Failed 失败: 源目录不存在 MuMuPlayer [|||||||||| ] 55% Verify 校验复制结果 vmware-file [||||||||||||||||||] 100% Done ``` 状态说明: | 状态 | 说明 | | --- | --- | | `Pending` | 任务尚未开始。 | | `Copy` | 正在复制。 | | `Verify` | 正在校验复制结果。 | | `Remove` | 正在删除原目录。 | | `Link` | 正在创建符号链接。 | | `Done` | 任务成功完成。 | | `Failed` | 任务失败。 | 在支持颜色的 PowerShell 终端中: - 进度条使用蓝色显示。 - `Done` 使用绿色显示。 - `Failed` 使用红色显示。 ## 失败详情 失败任务会在进度行中显示短原因,避免长路径把表格撑乱。 所有任务结束后,会统一输出完整失败详情: ```text 失败详情: .\tttt2\: 源目录不存在: .\tttt2\ .\MuMuPlayer\: 复制校验未通过: 源目录有 ...,目标目录有 ... ``` 如果复制校验失败,详情中会包含: - 源目录条目数 - 源目录精确字节数 - 目标目录条目数 - 目标目录精确字节数 - 字节差值 - 最多 5 个差异示例 差异示例可能包括: - 缺失文件 - 文件大小不一致 - 目标目录多出的文件 ## 退出码 | 退出码 | 含义 | | --- | --- | | `0` | 所有任务成功。 | | `1` | 至少一个任务失败。其他任务可能已经成功。 | | `2` | 参数错误。 | ## 注意事项 - 建议在迁移前关闭正在使用这些目录的程序。 - 对于模拟器、虚拟磁盘、大型缓存目录等,复制期间文件可能仍在变化,可能导致校验失败。 - 目标父目录必须已经存在。 - 源目录通配符只匹配直接子目录,不递归匹配,也不会匹配文件。 - 每个源目录在目标父目录下对应的目标路径不能已经存在。 - 创建符号链接可能依赖 Windows 开发者模式或管理员权限。 ## 项目结构 ```text link_move build.ps1 构建脚本 install.ps1 安装脚本 link_move.cs 主程序源码 bin\link_move.exe 构建产物 ```