【免费下载链接】MacSai
Mac Sai: the open-source Mac cleaner, optimizer, and malware scanner. A free, Apple-notarized alternative to CleanMyMac, built with Swift 6 and SwiftUI.
Mac Sai 是一款开源免费、经 Apple 公证的 Mac 清理、优化与恶意软件扫描工具,也是 CleanMyMac 的无订阅替代品。它的重复文件(Duplicates)模块除了传统的"删除冗余副本",还新增了Consolidate 合并模式:把重复文件替换为 APFS 克隆,所有路径原样保留、继续可用,只回收重复占用的磁盘空间。本文带你快速上手这一模式,并讲清楚它"一份内容、零冗余空间"背后的原理。
一、不删除文件释放空间:重复文件清理的新解法
传统重复文件工具的处理方式只有一个:留下一份原件,把其余副本丢进废纸篓。问题在于:
- 有些路径被应用硬编码引用,删掉副本后应用会报错或反复重建缓存;
- 你不确定哪份才是"该留的那份",删除动作本身就有风险;
- 一旦误删,找回成本很高。
Mac Sai 的合并模式换了个思路:不删任何文件,只让多份内容相同的文件共享同一块物理磁盘空间。
二、30 秒上手:扫描重复文件并切换合并模式
- 安装 Mac Sai(一条命令):
brew install --cask mac-sai,或下载 DMG 直接打开(已公证,无警告、无需终端)。 - 在侧边栏进入文件 → 重复文件,点击"扫描"。扫描采用渐进式策略:先按文件大小分组,再对候选文件做部分 SHA-256 哈希,最后完整哈希确认——避免对全盘文件做无谓计算。
- 扫描完成后,结果列表上方的分段控件提供两种模式:
- 删除重复项:所选副本移入废纸篓,每组保留一个原件;
- 合并:所选副本保留在原位并转为克隆,仅释放重复占用的空间,不删除任何文件。
- 勾选要处理的副本,点击"合并"。确认框会给出预演结果:"保留所有副本,预计释放 X"。
- 完成后,结束页报告实际释放的字节数、合并数量,以及每个被跳过文件的原因——不会静默失败。
💡 快捷键:⌘R 开始扫描,⌘K 对选中项执行当前模式操作。
三、背后原理:APFS 克隆与写时复制(Copy-on-Write)
合并模式的核心,是 APFS 文件系统独有的文件克隆能力:
- 克隆不是复制。系统克隆调用会为副本生成一个新的文件条目,但它与原件共享底层物理数据块,创建时几乎不占额外空间。
- 写时复制(COW)接管后续:当你修改其中任意一份,APFS 才把被改动的数据块"分裂"出来,另一份保持原样。
- 因此合并后的两个路径互相独立——各自可编辑、可删除,互不影响;但在任何一方被修改之前,磁盘上只存一份数据。
一次合并的完整流程(源码见 FileConsolidator.swift):
| 步骤 | 做什么 | 为什么 |
|---|---|---|
| ① 资格检查 | 普通文件?同一卷?卷支持克隆?可写?非受保护路径? | 任一不满足直接跳过,文件不动 |
| ② 二次哈希 | 重新计算两侧 SHA-256 对比 | 防止扫描后文件已被修改(TOCTOU 防护) |
| ③ 克隆到临时文件 | 在副本所在目录生成唯一临时克隆 | 同卷临时文件,保证下一步可原子替换 |
| ④ 校验克隆 | 对临时文件完整哈希 | 确保与原件逐字节一致 |
| ⑤ 恢复元数据 | 把副本原有的权限、修改时间写回克隆 | 文件"看起来"还是原来那个 |
| ⑥ 原子替换 | 一步rename换掉旧副本 | 任何一步失败,原副本都完好无损 |
UI 层的模式切换与预演逻辑在 DuplicatesView.swift 和 DuplicatesConsolidation.swift 中实现;重复文件本身的检测(按大小分组 → 部分哈希 → 完整哈希 → 硬链接去重)见 DuplicatesModule.swift。
四、哪些文件会被自动跳过?
合并模式对安全的要求比删除更严格,以下情况会跳过并如实报告原因:
| 跳过原因 | 触发条件 |
|---|---|
| 内容已更改 | 执行前二次哈希发现两份文件已不一致 |
| 跨卷 | 两份文件不在同一磁盘卷(克隆不能跨卷) |
| 非 APFS 卷 | 所在文件系统不支持文件克隆 |
| 非普通文件 | 符号链接、目录、应用包等 |
| 不可写 | 副本或其所在目录没有写权限 |
| 受保护路径 | 命中 SafetyGuard.swift 的安全黑名单 |
⚠️ 混合组也能正确处理:一组里可合并的副本正常合并,不可合并的列入跳过清单,整组不会被误伤。
五、使用建议与边界
- 只适用于 APFS 卷:macOS 14+ 的内置磁盘默认就是 APFS;外置 HDD(HFS+)上的重复文件请改用删除模式。
- 合并后重新扫描:已合并的组再次扫描时,可回收空间会显示为约 0——这是正确行为,只是列表中仍会列出该组。
- 修改后空间会回涨:合并后的副本一旦被各自编辑,被改动的部分会按写时复制分裂出新数据块,磁盘占用逐渐回到独立文件水平。
- 误操作无惧:合并是"替换"而非"删除",没有任何一份内容消失;即使中途中止,已完成的替换也是完整一致的。
六、延伸阅读:源码与设计文档
| 资料 | 路径 |
|---|---|
| 合并功能设计文档 | docs/superpowers/specs/2026-08-06-duplicate-consolidation-design.md |
| 核心实现(克隆替换引擎) | Sources/MacCleanKit/FileConsolidator.swift |
| 安全路径校验 | Sources/MacCleanKit/SafetyGuard.swift |
| 合并模式测试套件 | Tests/MacCleanTests/FileConsolidatorTests.swift |
| 中文 README(功能总览) | README.zh-CN.md |
Mac Sai 用一次 APFS 克隆调用,把"清理重复文件"从做减法变成了做共享——文件一个不少,空间实打实地回来了。
【免费下载链接】MacSai
Mac Sai: the open-source Mac cleaner, optimizer, and malware scanner. A free, Apple-notarized alternative to CleanMyMac, built with Swift 6 and SwiftUI.
相关推荐
nvm版本清理:删除不再使用的旧版本释放空间
nvm版本清理:删除不再使用的旧版本释放空间 引言:Node.js开发者的磁盘空间困境 作为Node.js开发者,你是否经常遇到以下问题: 项目依赖不同Node
CLI开发工具版本控制节省92%磁盘空间!treehouse的APFS写时复制文件共享深度解析
节省92%磁盘空间!treehouse的APFS写时复制文件共享深度解析 Treehouse 是一款面向 AI 编程场景的 worktree 池管理工具,让每个
WeChatMsg:3步把微信聊天记录导出成文档,永久保存
WeChatMsg:3步把微信聊天记录导出成文档,永久保存 换手机、清理缓存、搬家重装系统——任何一个操作都可能让几年的微信聊天记录清零。WeChatMsg 就
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考