删除一个 Mac 应用之后,还留下了哪些文件
把 Mac 应用拖进废纸篓之后,缓存、容器和偏好设置仍会留在磁盘上。这里说清楚残留文件都在哪里,以及怎样才算安全地彻底卸载。
更多同类指南目前仅提供英文版本。 查看全部文章
Windows 有注册表,也有一套卸载程序的惯例,虽然不完美,但至少会尝试清理自己留下的痕迹。macOS
两样都没有。把一个应用拖进废纸篓,你精确地只删掉了一样东西:.app
包。它曾经写入磁盘的其他所有内容——一个典型的应用会写入五六个不同的地方——都会原封不动地留在原处,永远如此,除非你自己去把它们找出来。
除了自己的包,应用实际还会写到哪里
单单一个应用,就可能在下面这些位置全都留下文件,而删除应用本身完全不会动到它们中的任何一个:
~/Library/Application Support/<AppName> # settings, local databases, sometimes huge caches
~/Library/Caches/<bundle.id> # rebuildable cache — see the dedicated guide below
~/Library/Containers/<bundle.id> # sandboxed apps get a full private filesystem here
~/Library/Preferences/<bundle.id>.plist # settings, tiny, but adds up across hundreds of apps
~/Library/Saved Application State/<bundle.id>.savedState # window/tab restore state
~/Library/Logs/<AppName> # diagnostic logs, sometimes gigabytes for chatty apps
这些都不是 bug,也不是应用行为不端——这些是苹果文档里明确规定、应用放置这类数据的正确位置。问题完全出在移除这一端:应用本身消失之后,macOS 里没有任何东西负责把这些数据清理掉。
找出一个你已经删掉的应用留下了什么
如果你已经把应用拖进了废纸篓,现在才想起来查它留下了什么,它的包标识符(bundle identifier)就是关键——上面提到的一切都是按这个标识符归档的,但应用已经不在了,没法告诉你那个标识符是什么。
# Search Spotlight's metadata for a plausible bundle identifier match
mdfind "kMDItemCFBundleIdentifier == '*appname*'"
# Or just search by the app's name directly across the usual leftover locations
find ~/Library/Application\ Support ~/Library/Caches ~/Library/Containers \
~/Library/Preferences ~/Library/Saved\ Application\ State ~/Library/Logs \
-iname "*appname*" -maxdepth 1 2>/dev/null
包标识符是反向 DNS 格式(com.company.AppName),所以就算不确定精确的标识符,搜索公司名或产品名通常也能把所有相关文件夹都找出来。
哪些残留真正值得删除
不是每一份残留都值得逐个去揪出来——一个 .plist
偏好设置文件只有几 KB,为你卸载过的每一个应用都去搜一遍,不是什么值得花一下午做的事。真正值得在意的是那些体积较大的:
~/Library/Containers/<bundle.id>——对沙盒化的应用(大多数现代 App Store 应用,以及许多其他应用)来说,这基本上等于一个应用可以完全自由支配的私有文件系统。视频编辑器、设计工具,以及任何处理大型媒体文件的应用,都经常留下好几 GB 的容器。~/Library/Application Support/<AppName>——如果一个应用有本地数据库,这就是它实际存放的位置。聊天应用、笔记应用,以及任何带离线缓存的应用,都常常在这里放上好几 GB。~/Library/Logs/<AppName>——通常很小,但少数应用(视频会议工具是常客)日志记得极其啰嗦,久而久之能积累到 1 GB 甚至更多。
已删除应用对应的 ~/Library/Caches/<bundle.id>
是毫无疑问安全的——这是给一个已经不存在的应用用的缓存,根本不用担心什么重建成本,这一点和清理你还在用的应用的缓存不一样。
# Once you've confirmed the app is really gone and identified its folders:
rm -rf ~/Library/Application\ Support/AppName
rm -rf ~/Library/Containers/com.company.AppName
rm -rf ~/Library/Caches/com.company.AppName
删除 Container 之前,唯一值得先检查的一件事
在极少数情况下,一个沙盒化应用的 Container 可能保存着你在这个应用里创建、却从未导出过的内容的唯一副本——一些笔记应用和绘图应用就是这样存放你的实际内容的,而不是放进常规的 Documents 文件夹。在删除一个你还拿不准的应用的 Container 之前,如果还能打开这个应用,先再打开一次,看看里面有没有什么内容值得先导出来。确认没问题之后,删除是立即生效且不可逆的,因为没有什么可以重新生成——和任何文件删除一样,只是这次没有应用在旁边提醒你了。
为什么规模一大,这事就比听起来更严重
没人会因为卸载一个应用留下 200 MB 残留就担心。真正的成本在于累积:一台几年里装过又卸过上百个应用的 Mac——试用版、一次性工具、装来试试没留下的应用——很容易背着 10–20 GB 来自早已不在机器上的软件的孤儿数据,而且完全看不见,因为访达里已经没有图标提醒你它曾经存在过。
上面的命令免费,也确实管用,只是处理一百个应用比处理一个要慢得多。为了把这件事自动化,我们正在开发 DevCruft,一款面向开发者的免费 Mac 应用,设计上会找出每一个已不再安装的应用留下的残留,并一次性全部回收。想在它推出时收到通知,欢迎加入候补名单。
关于你仍在使用的应用留下的缓存文件夹,可以看看~/Library/Caches 指南。