brew cleanup -s 详解:清理 Mac 上的 Homebrew 缓存
AskClean 团队 · 更新于 2026-11-02
动手之前先运行 brew cleanup -n 预览。普通的 brew cleanup 会移除陈旧的锁文件、过时的下载文件和已安装 formula 的旧版本;不指定软件包、全局运行时,除非设置了 HOMEBREW_NO_AUTOREMOVE,它还会卸载已经没有软件需要的依赖。-s(即 --scrub)清得更多:最新版本的缓存下载文件也会删除,比如下载过却从没安装、或后来已经卸载的软件包。不管加不加 -s,仍然装着的软件包,其下载文件都会保留。用 brew --cache 确认缓存的实际位置。

Homebrew 的数据不只在一个缓存目录里
下载缓存通常位于 ~/Library/Caches/Homebrew,但 HOMEBREW_CACHE 可以改变它的位置,应以 brew --cache 的输出为准。formula 按版本安装成 keg,位于 Cellar;cask 的记录位于 Caskroom;当前在用的版本一般通过 Homebrew prefix 下的链接访问。用 brew --cellar、brew --caskroom 和 brew --prefix 查找这些位置,不要把它们当缓存删除。下载文件通常可以重新获取,旧 keg 的那个确切版本却未必找得回来。
先做只读检查
运行 du -sh "$(brew --cache)" 测量实际的下载缓存,再用 brew cleanup -n(即 --dry-run)预览:过时的下载文件、陈旧的锁文件、旧版 formula,以及列在“Would autoremove”下、将被自动卸载的依赖。看到熟悉的工具时,用 brew list --versions 核对当前版本和旧版本,确认回滚流程或写死的路径不依赖旧 keg。
- 运行 brew --cache,并用 du -sh "$(brew --cache)" 记下当前下载缓存的大小。
- 运行 brew cleanup -n,逐项检查过时的下载文件、旧版 formula 和将被自动卸载的依赖;必要时用 brew list --versions 核对。
- 根据预览选择:普通的 brew cleanup、只针对一个软件包的 brew cleanup <name>,或者先预览、再运行 brew cleanup -s 或 brew cleanup --prune=all;想保留依赖,就在预览和实际命令前都加上 HOMEBREW_NO_AUTOREMOVE=1。
- 删除旧版 formula 之前,确认它们不在回滚流程或固定版本的工作流里;使用 --prune=all 之前,确认网络、代理和上游源都能让你重新下载。
- 再运行一次 brew cleanup -n、测量缓存、核对已安装的版本,并启动当前工作依赖的重要 Homebrew 工具。
dry run 只是预览,不是备份。Homebrew 删除的旧 keg 和下载文件通常不会进入 macOS 的废纸篓,上游也不保证还能提供完全相同的版本。真正运行 brew autoremove,或在未设置 HOMEBREW_NO_AUTOREMOVE 时全局运行 brew cleanup,都会卸载依赖。
按可接受的代价选择清理范围
核对预览后,运行 brew cleanup 做常规的保守维护:目前默认把超过 120 天的下载文件列为候选,同时会删除旧版 formula。不想让它顺带卸载用不到的依赖,就在预览和实际命令前都加上 HOMEBREW_NO_AUTOREMOVE=1。-s 是 --scrub 的缩写,不是“安全”或“静默”的意思:对没有安装的软件包(下载过却没安装的,或后来已卸载的),它连最新版本的缓存下载文件也会清掉,但仍保留已安装 formula 和 cask 的下载文件,并不会清空整个缓存;运行前先用 brew cleanup -n -s 预览。只有愿意承担全部重新下载的代价时,才先预览、再运行 brew cleanup --prune=all,它会不论文件年龄清理缓存。只处理一个软件包时,先运行 brew cleanup -n <name>,确认后再运行 brew cleanup <name>;尖括号只是占位符。
保护已安装的软件、配置和用户数据
brew autoremove 会卸载 Homebrew 认为不再需要的依赖,不属于缓存清理;而且除非设置了 HOMEBREW_NO_AUTOREMOVE,全局运行的 brew cleanup 本身就会执行同样的卸载。要单独运行它,先用 brew autoremove --dry-run 预览,确认脚本、构建系统和服务没有直接调用这些 formula。不要对 brew --prefix、brew --cellar、brew --caskroom 或整个 ~/Library/Caches 运行宽泛的 rm -rf;Brewfile、shell 配置、Homebrew 服务、数据库、证书和项目文件也都不是缓存。清理后再运行一次 brew cleanup -n、测量缓存、用 brew list --versions 核对版本,并测试关键命令。AskClean 可以把整个 Homebrew 下载缓存列为一项供你审核,确认后会永久删除,但不会清理 Cellar 里的旧 keg;要按软件包状态处理旧版本,请用 brew cleanup。
清理边界与恢复成本
brew cleanup -s 会删什么?先用 brew cleanup -n 预览,分清 -s(--scrub)与 --prune=all 的清理范围,并留意全局运行的 cleanup 还会卸载不再需要的依赖,安全清理 Mac 上的 Homebrew 缓存和旧版本。
| 环节 | 检查位置或命令 | 要点 |
|---|---|---|
| Homebrew 的数据不只在一个缓存目录里 | brew --cache | 下载缓存通常位于 ~/Library/Caches/Homebrew,但 HOMEBREW_CACHE 可以改变它的位置,应以 brew --cache 的输出为准。 |
| 先做只读检查 | brew cleanup -n | 运行 du -sh "$(brew --cache)" 测量实际的下载缓存,再用 brew cleanup -n(即 --dry-run)预览:过时的下载文件、陈旧的锁文件、旧版 formula,以及列在“Would autoremove”下、将被自动卸载的依赖。 |
| 按可接受的代价选择清理范围 | brew cleanup / brew cleanup -s / brew cleanup --prune=all | 核对预览后,运行 brew cleanup 做常规的保守维护:目前默认把超过 120 天的下载文件列为候选,同时会删除旧版 formula。 |
| 保护已安装的软件、配置和用户数据 | brew autoremove --dry-run(不属于缓存清理) | brew autoremove 会卸载 Homebrew 认为不再需要的依赖,不属于缓存清理;而且除非设置了 HOMEBREW_NO_AUTOREMOVE,全局运行的 brew cleanup 本身就会执行同样的卸载。 |
常见问题
brew cleanup 在 Mac 上安全吗?
它是 Homebrew 支持的维护命令,但请先用 brew cleanup -n 预览。它会移除过时的下载文件和已安装 formula 的旧版本;全局运行时,除非设置了 HOMEBREW_NO_AUTOREMOVE,还会卸载已经没有软件需要的依赖。运行前请确认没有工作流依赖旧 keg 或清单里的依赖。
brew cleanup -s 和 --prune=all 分别会删什么?
-s(--scrub)会连最新版本的缓存下载文件也一起清掉——针对的是没有安装的软件包,比如下载过却从没安装、或后来已卸载的;你仍然装着的 formula 和 cask,其下载文件会保留。--prune=all 会不论文件年龄清理缓存文件。两者都仍包含普通 cleanup 对陈旧锁文件和旧版 formula 的清理。请先用 brew cleanup -n -s 或 brew cleanup -n --prune=all 预览,并做好以后重新下载的准备。
清理完还要运行 brew autoremove 吗?
通常不需要:除非设置了 HOMEBREW_NO_AUTOREMOVE,全局运行的 brew cleanup 已经做了同样的卸载。如果要单独运行,先用 brew autoremove --dry-run 预览。它卸载的是 Homebrew 认为不再需要的依赖 formula,不会清理下载缓存,还可能移除你的脚本直接调用的工具。
参考来源