卸载 Mac 应用后如何清理残留文件
同一款已卸应用,两台残留扫描器会给出两份不同的列表。这不是 bug。每款工具自有归属规则、拒绝清单,以及对管理员权限的边界。屏幕上你看到的一切,都由这三件事决定。一旦理解归属,清理残留就不再是「谁找的垃圾更多」,而是「谁的误判伤人更轻」。
本文讲「之后」:应用已经不在,或刚进废纸篓,怎样用卸载器应有的谨慎去审残留。应用仍在时的完整流程见彻底卸载;工具选型见AppCleaner 之外。
macOS 上的「卸载」实际指什么
系统并不把应用当成一个对象配一个删除按钮。至少有三层:
| 层 | 常见位置 | 谁来删 |
|---|---|---|
| 应用包 | /Applications、~/Applications、Setapp 等 |
你、废纸篓或包管理器 |
| 用户支持数据 | ~/Library/… |
残留扫描或仔细手审 |
| 系统 / 特权 | /Library、助手、收据、扩展 |
先厂商卸载器 |
拖进废纸篓只保证第一层。中间层是通用工具真正能帮忙的地方。第三层它们常常假装能做、实际做不好:驱动、网络扩展、特权助手、许可守护。Apple 仍建议优先使用厂商 Uninstall 应用,原因在此(删除或卸载应用)。
用户残留实际在哪
多数第三方残留集中在用户资源库:
| 区域 | 通常是什么 |
|---|---|
Application Support/<名称或 ID> |
数据库、离线包、项目状态 |
Caches/<bundle id> |
可再生缓存 |
Containers/ 与 Group Containers/ |
沙盒主目录与共享组 |
Preferences/(含 ByHost) |
设置 plist |
Logs/、DiagnosticReports |
诊断 |
Saved Application State/ |
窗口恢复 |
HTTPStorages/、WebKit、Cookie |
该身份的网络状态 |
LaunchAgents/ |
有 plist 的用户登录助手 |
Application Scripts/ |
沙盒脚本包 |
/Library 下系统级路径(LaunchDaemons、PrivilegedHelperTools、/private/var/db/receipts 等)风险更高。优先厂商卸载器;通用扫描在那里应仅供审核。
沙盒应用看起来整齐:主容器多在 ~/Library/Containers/<bundle id>。它仍可能用 App Group、Application Scripts、共享缓存、CloudKit 或钥匙串。沙盒收窄直接写盘,并不保证「一个目录搞定」。非沙盒应用会散落到 Application Support、Caches、Preferences、Logs、Saved Application State、WebKit 与 Cookie。散落越广,两款工具越容易意见不一。
归属是全部技能
安全的残留发现键在身份,不在营销名。
Bundle id 与显示名
com.example.widget 跨改名与本地化仍稳定。显示名不。两款产品可共享公司目录(…/Application Support/Google),而你只卸了一款。用字符串匹配「Google」是扫描器造出数 GB 误报的方式。
按 identifier 匹配精确,几乎不会提出兄弟应用的数据;会漏掉应用用产品名命名的文件夹。
按名称匹配能找到那些文件夹,也会命中只是共享一个词的路径。找得多,也更容易错。
删除前的实用检查:
mdfind 'kMDItemCFBundleIdentifier == "com.example.widget"'
ls /Applications ~/Applications 2>/dev/null
若该 id 仍有任何实例,共享支持路径应按仍在使用处理。
助手与内嵌身份
现代应用常带相关 id:com.example.widget.helper、Info.plist 里 SMPrivilegedExecutables 声明的名、Contents/Library/LoginItems 下的登录项。彻底的扫描器在应用消失之前从包内收集这些 id。包已不在后,你只剩当时记录或盘上仍精确存在的名字。
Group 容器
~/Library/Group Containers/ 放的是故意共享的套件数据:
group.<bundle id>- 团队前缀如
<TeamID>.<bundle id> - 多应用共用的
group.*空间
只有精确所有者路径才适合自动关联。任一兄弟仍在时,共享 group 应仅供审核或不动。这是「找得更多」的工具最容易伤人的类别。
名称变体与渠道版
Foo Beta 可能留下 Foo Beta、FooBeta,以及其实属于仍在安装的正式版的稳定 Foo 文件夹。去掉渠道后缀的基名误报风险高:除非证明正式版已不在,否则仅供审核。
三条安全入口
1. 先厂商卸载器
安全代理、VPN、音频驱动、终端管理工具知道自己的收据与扩展拆卸顺序。任何资源库遍历之前先跑它们。系统或网络扩展由 macOS 注册,只删文件不是可靠的停用流程。
2. 应用已经卸掉后再审
.app 已不在时,扫描仍带该 bundle id 或精确名称变体的路径。保守默认:
- 有归属时通常可删: 缓存、日志、窗口状态、崩溃报告
- 仔细审核: Application Support、Containers、Preferences(许可、离线邮件、项目库)
- 通常留下: 无精确归属的 Group Containers、资源库外的文稿、其他 id 仍需要的内容
测量候选:
du -sh ~/Library/Application\ Support/<Name> \
~/Library/Caches/<bundle.id> \
~/Library/Containers/<bundle.id> 2>/dev/null
权限错误通常表示终端没有完全磁盘访问,不代表目录为空。
3. 应用刚进废纸篓的一刻
很多人先拖再想。能察觉 ~/.Trash 里新的 .app、读取 Info.plist 身份、扫描相关支持文件并打开审核面板的流程,可以接住残留而不用翻资源库。有用与有害的分界:
- 绝不自动删除废纸篓里的应用包(放回必须可用)
- 不对受保护 / AV / MDM 类弹窗
- 清理工具自己在卸载流程中拖走的应用要有一次消费型抑制,否则面板会与卸载竞态
- 以完全磁盘访问为门;没有时宁可静默,也不从后台弹权限
Mole 采用这种形态:卸载残留与废纸篓触发的残留共用路径校验,普通文件可进废纸篓。清理里的「已卸应用残留」是长尾:应用离开数周仍有支持数据,一律先审核、默认不勾选,且在已装清单不完整时归属扫描失败则封闭(不出猜猜列表)。
孤儿不是「资源库里凡是大的」
找忘记卸的应用的残留,需要主张减法:枚举候选支持目录,再减去仍被已装软件主张的一切(bundle id、运行中应用、Launch Services 注册、厂商根)。若主张扫描不完整(超时、不可读目录),安全结果是零孤儿,不是一份热闹的列表。总能在干净机器上「找出」几十个垃圾应用的工具,是在优化销售数字。
静默期门也很重要:上周还在改写的配置,可能属于主张遍历看不到的 CLI 工具。较新的 mtime 应抑制候选。
实例:两款工具,同一厂商套件
你卸了产品 A;同公司产品 B 仍在。
- 工具 1(偏 identifier):列表小,多是
com.vendor.productA.* - 工具 2(偏名称):加上 4 GB 的
~/Library/Application Support/Vendor,以及两个产品共用的 group 容器
工具 2 看起来更彻底。它提出的删除可能弄坏产品 B。屏幕底部的合计不是质量分,上面的类别才是。
Homebrew 的孤儿收据
若应用来自 Homebrew Cask,只删 .app 可能留下 Caskroom 记录,阻碍重装。文件残留处理完后:
brew list --cask
若 token 仍在,用 brew uninstall --cask <token> 清关联(仅在接受 brew 更广清理时再依赖 --zap)。应用已不在却报「cask 未安装」是过期关联,不是手删 Caskroom 随机路径的理由。
即使名字对上也要拒绝
- 仍在安装的兄弟与渠道双份
- 共享 group 容器与厂商父目录
- 无经验证卸载路径的收据与特权助手
- 资源库外的用户文稿
- 夹在缓存路径旁的 AI 会话与模型目录(AI 清理)
常见错误
把「找到的列表」拉到最长。 候选更多,常常只是归属更差。
默认删 Group Containers。 那是故意共享的。
对 VPN、杀软、音频、虚拟化跳过厂商卸载器。
没有完全磁盘访问就测量, 然后断定「没什么了」。
批量删残留后立刻清空废纸篓。 若有重要东西被误归,留一天正常使用更稳。
如何验证
- 复测已删路径
- 确认该 id 的登录项或 LaunchAgent 已不在(启动项)
- 启动同一厂商兄弟应用
- 确认无误后再清空废纸篓
操作顺序
- 若应用有驱动、扩展或助手,先找厂商卸载器
- 仍在运行时导出或反授权(若有需要)
- 退出应用与可见助手
- 去掉应用包(或确认已在废纸篓)
- 按身份审残留;共享容器不动
- 如适用,处理 Homebrew cask 收据
- 物品先留在废纸篓,正常使用一段时间再清空
延伸阅读
- Apple:在 Mac 上删除或卸载 App
- 相关:彻底卸载、AppCleaner 替代、清理工具永不该删什么
残留清理是身份维护。技能不在最大化 GB,而在证明归属、保护共享状态、保持删除可恢复。
卸载后第一天该做什么
很多人卸完就立刻清空废纸篓。更稳的节奏是:
- 当天只把应用包和已确认可再生的缓存送进废纸篓
- Application Support、Containers 先留着,正常使用一天
- 若兄弟应用、同一厂商的其他产品都正常,再清第二批
- 仍不确定的路径,用
du -sh记下大小,过一周再决定
废纸篓占的是同卷空间,但换来可恢复窗口。磁盘已经极端满时,可以先清可再生缓存腾出余量,再处理争议路径。
权限与可见性
没有完全磁盘访问时,终端与很多扫描器会「看不见」容器与部分资源库目录。结果不是「没有残留」,而是「你没资格看」。
建议:
- 给终端或 Mole 打开完全磁盘访问后,再做一次测量
- 对比开启前后
du结果,避免在半盲状态下做删除决策 - 收回不再使用的工具的完全磁盘访问,缩小权限面
与「完整卸载」文的分工
彻底卸载 讲的是应用还在时的顺序:厂商工具、导出、退出、删包、再审残留。本文默认包已经不在,重点变成身份归属与共享数据。两篇一起读,比只记「拖进废纸篓」完整。