☰
不删除任何副本就释放空间:Mac Sai 重复文件 Consolidate 合并模式与 APFS 写时复制克隆原理
2026/10/11 10:22:12 网站建设 项目流程

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/mac/MacSai
点击查看免费下载

Mac Sai 是一款开源免费、经 Apple 公证的 Mac 清理、优化与恶意软件扫描工具,也是 CleanMyMac 的无订阅替代品。它的重复文件(Duplicates)模块除了传统的"删除冗余副本",还新增了Consolidate 合并模式:把重复文件替换为 APFS 克隆,所有路径原样保留、继续可用,只回收重复占用的磁盘空间。本文带你快速上手这一模式,并讲清楚它"一份内容、零冗余空间"背后的原理。

一、不删除文件释放空间:重复文件清理的新解法

传统重复文件工具的处理方式只有一个:留下一份原件,把其余副本丢进废纸篓。问题在于:

  • 有些路径被应用硬编码引用,删掉副本后应用会报错或反复重建缓存;
  • 你不确定哪份才是"该留的那份",删除动作本身就有风险;
  • 一旦误删,找回成本很高。

Mac Sai 的合并模式换了个思路:不删任何文件,只让多份内容相同的文件共享同一块物理磁盘空间。

二、30 秒上手:扫描重复文件并切换合并模式

  1. 安装 Mac Sai(一条命令):brew install --cask mac-sai,或下载 DMG 直接打开(已公证,无警告、无需终端)。
  2. 在侧边栏进入文件 → 重复文件,点击"扫描"。扫描采用渐进式策略:先按文件大小分组,再对候选文件做部分 SHA-256 哈希,最后完整哈希确认——避免对全盘文件做无谓计算。
  3. 扫描完成后,结果列表上方的分段控件提供两种模式:
    • 删除重复项:所选副本移入废纸篓,每组保留一个原件;
    • 合并:所选副本保留在原位并转为克隆,仅释放重复占用的空间,不删除任何文件。
  4. 勾选要处理的副本,点击"合并"。确认框会给出预演结果:"保留所有副本,预计释放 X"。
  5. 完成后,结束页报告实际释放的字节数、合并数量,以及每个被跳过文件的原因——不会静默失败。

💡 快捷键:⌘R 开始扫描,⌘K 对选中项执行当前模式操作。

三、背后原理:APFS 克隆与写时复制(Copy-on-Write)

合并模式的核心,是 APFS 文件系统独有的文件克隆能力:

  1. 克隆不是复制。系统克隆调用会为副本生成一个新的文件条目,但它与原件共享底层物理数据块,创建时几乎不占额外空间。
  2. 写时复制(COW)接管后续:当你修改其中任意一份,APFS 才把被改动的数据块"分裂"出来,另一份保持原样。
  3. 因此合并后的两个路径互相独立——各自可编辑、可删除,互不影响;但在任何一方被修改之前,磁盘上只存一份数据。

一次合并的完整流程(源码见 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.

项目地址:https://gitcode.com/gh_mirrors/mac/MacSai
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询