文章
我的自用 Mac 垃圾清理软件
我的 Mac 是丐版 M4,256 GB。平时折腾开发环境、装几个 Electron 应用、再存点视频和素材,用不了多久容量就告急。每次清出几个 GB,过两周又填回去。以前常用 CleanMyMac 或者腾讯的柠檬清理。这两款其实都挺好的:该清的能清,界面也顺手,比系统自带的存储管理直观。但每次用完,总觉得多少有不满意的地方。
于是就有了这个东西:CleanSweep,一个自用的 macOS 清理工具。原生 SwiftUI + AppKit,纯 swiftc 直接编译,不依赖 Xcode 工程,也没有第三方库。它目前只在我自己的 Mac 上跑,没有官网,也没有订阅页。
它认为什么算垃圾
内置 44 条规则,分 9 类:用户缓存、日志与诊断、开发缓存、浏览器与隐私、下载与附件、废纸篓与备份、系统深层、缩略图与预览、云同步缓存。每条规则都要先回答三个问题:清什么、删了会怎样、默认勾不勾。
答案分三档:
- 安全:系统或应用会自动重建的内容,比如缓存、日志、QuickLook 缩略图、Xcode DerivedData、各种包管理器缓存。默认勾选。
- 谨慎:删了可能需要重新下载、重新登录,或者下次打开慢一点,比如 iCloud 同步缓存、HTTPStorages、旧的 iOS 调试支持文件。默认不勾。
- 危险:不可恢复或影响面大,比如浏览器历史、Xcode 归档、Docker 虚拟机磁盘、休眠镜像、废纸篓。必须自己手动勾。
用户文件一律走「移入废纸篓」,缓存和日志才直接删除。默认选择等级可以在设置里改,但我一直只开「安全」:一个清理软件最重要的能力不是找出多少垃圾,而是默认不碰你明天还要用的东西。
删得慢一点,但删得对
真正难的不是扫描,是点下「立即清理」之后的几秒钟。CleanSweep 的执行器不直接 rm,流程大概是这样的:
- 扫描时记下每个目标的文件身份(inode、大小、修改时间、内容指纹)。
- 执行前再检查一遍路径保护和文件身份;扫描后变过的、读不全的、落在白名单里的,全部跳过并写进报告。
- 把目标先移进同卷的私有暂存目录
.cleansweep-stage-*(0700),再复核一次身份和内容,确认无误才真正unlinkat。 - 删除用目录描述符逐层进行,不跟随子目录里的符号链接,也不跨挂载卷;失败就尝试原路恢复,原路径已经被重建时绝不覆盖新内容。
这套东西听起来像给银行转账写的,但清理工具确实需要。缓存目录里经常混着用户数据,符号链接可以把一个“删除缓存”的操作带到完全无关的位置。慢一点,换的是删错了还能说清楚。
其它几条同类规则:
- 重复文件按逻辑长度分组,先比首尾各 16 KB 的样本,再对候选做全量 SHA-256;每组至少保留一份,硬链接按文件身份去重,带资源分支的文件不参与自动清理。
- 清理浏览器历史要求浏览器完全退出,主库和
-wal/-shm/-journal必须整组选中、整组暂存;暂存期间浏览器重启就停止并恢复。 - 卸载应用先删应用本体,成功后才处理用户确认的关联文件;缓存默认勾选,用户数据和配置默认保留,共享容器和后台组件不自动删。
- 报告把「直接删除」和「移入废纸篓」分开算,后者仍占磁盘;“释放了多少”用同一批卷的可用空间前后差值作实测,读不到卷容量就不编数字。
它现在会干什么

概览是一块仪表盘:环里是候选总量,下面是候选项目数、涉及分类、磁盘已用/剩余。九个分类固定列出来,空的也留着,点进去只做筛选,不改变任何勾选。

智能清理按规则分组,每条规则带风险徽章和一句人话说明;可以按分类筛选、按体积/名称/分类排序、搜规则或路径,每条都能在访达里定位。底部能按等级重置勾选、清空选择、选择全部或当前分类。
其余页面:
- 大文件:按 100 MB / 500 MB / 1 GB / 5 GB 四档阈值找出体积最大的文件,保留前 2,000 项、先展示 400 项;受保护的文件只能看不能清,移入废纸篓前会再次确认。
- 重复文件:阈值从 100 KB 到 100 MB,按内容哈希分组,默认建议保留修改时间最早的一份;可以逐项改保留副本、排除整个目录(会加进白名单并立刻重扫)。
- 应用程序:列出
/Applications和~/Applications下的应用与体积,卸载时逐条列出关联项,缓存、用户数据、共享容器、后台组件分开呈现。 - 菜单栏:常驻一个星星图标,显示安全级可清理体积;点开可以直接快速清理安全项,也能按分类跳到主窗口。
- 清理记录:最多留 20 条,成功、部分失败、完全失败分开显示,失败项完整列出原因,支持拷贝和导出。
- 设置:默认选择等级、清理前二次确认、扫描范围、44 条规则开关和白名单都在这里;完全磁盘访问管读,管理员授权管删系统级项目,两类权限互不替代。

一些不太好意思讲的取舍
删功能比加功能难。 之前有过「文件夹占用」和「残留清理」两个页面,都能用,但我一年点不了两次;自用软件里,没人用的功能和坏掉的功能没有区别,留着只会让未来的自己以为下一版会修。删掉之后侧栏从八个入口变成六个,干净了。
0 字节的东西也是东西。 「清空废纸篓」一开始扫出 0 项:废纸篓里有 242 个空目录和 16 个 0 字节文件,全被「0 字节不释放空间」的过滤条件滤掉了。Finder 里明明有 259 项。后来给这条规则单独开了 includesEmptyItems——清空的语义是清空,不是“释放了多少空间”。
路径形式不统一,整棵树会静默消失。 macOS 的 /var、/tmp、/etc 是 /private 下的符号链接,不同 API 返回的写法不一样。扫描根和跳过项如果不先统一成 /private/var/...,一条前缀规则就能让整棵扫描树被跳过,而且不报任何错。
系统比你想的更黏。 Safari 退出后还留着 SafariWidgetExtension,进程检查一度把它当成浏览器没退,历史清理永远被拦。另一个应用包里 33 个 root 属主的软链接,readlink 对普通用户返回 EACCES,扫描把它判成“权限不足”,整个应用从卸载列表里消失——实际上路径解析根本不需要读链接目标。
它只管自己能管的事。 不做“系统优化”,不动文档、桌面、图片、音乐、影片;系统自带应用不给卸载;APFS 共享块和外置盘拔插这类场景没有完整事务隔离,报告里的体积是估算,真正可信的是清理前后同一批卷的可用空间差值。它也没做公证和分发——本地 ad-hoc 签名就够用,代价是重新构建后完全磁盘访问要重新授权。
现在
它就在菜单栏上待着,平时没有存在感。每周扫一次,默认只勾安全项,清完看一眼报告;需要找大文件或卸载应用时才打开主窗口。没有更新检查,没有遥测,没有“您的意见对我们很重要”。想改就改,./build.sh 一遍,编译、自检、ad-hoc 签名、替换旧产物,几分钟之后新版本就躺在那儿了。
评论0