开发机用久以后,磁盘空间经常不是被一个明显的大文件吃掉,而是被几类东西慢慢堆起来:用户根目录里的旧缓存、迁移残留的 Intel Homebrew、本地数据库日志、以及一些已经不用的语言环境。
这篇记录一次 Mac 开发机清理思路。重点不是“看到大目录就删”,而是先分清哪些是缓存、哪些是运行环境、哪些是数据库数据,再决定怎么处理。
先看根目录,不要被系统目录吓到
macOS 根目录下常见这些目录:
/Applications
/Library
/System
/Users
/Volumes
/private
/usr
/opt
/tmp -> private/tmp
/var -> private/var
这些大多是系统正常结构。真正需要警惕的不是这些名字,而是是否出现了应用随手创建的陌生顶层目录,或者个人项目、压缩包、数据库文件被放到了用户根目录。
可以先做只读检查:
ls -la /
df -h /System/Volumes/Data
如果根目录没有异常,再转到用户目录和开发工具目录。
用户根目录:重点找旧项目、旧缓存和误装依赖
用户根目录最容易堆东西。常见残留包括:
- 旧下载目录;
- 旧日志;
- Java crash log;
- 误装在用户根目录的
node_modules; - Gradle、pnpm、npm、Flutter、Python 等缓存;
- 旧代理、旧输入法、旧开发工具配置。
可以先找大文件:
find "$HOME" -maxdepth 1 -type f -size +10M -print -exec ls -lh {} \;
再看几个常见缓存:
du -sh ~/.gradle ~/.npm ~/.pnpm-store ~/.pub-cache ~/.m2 2>/dev/null
如果明确不用 Gradle,可以删 ~/.gradle。如果仍然写 Java,但主力是 Maven,~/.m2 反而要谨慎一点,因为 Maven 依赖会放在那里。
如果发现用户根目录有 package.json、package-lock.json、node_modules,要先看它是不是某个项目误装到了家目录。很多时候是因为在错误目录执行过 npm install。
敏感文件先迁移,不要顺手删除
清理时遇到疑似密钥、钱包、账号、数据库导出、交易数据的文件,处理原则应该反过来:不是先删,而是先迁移到更明确的位置。
比如一个多年以前的 CSV,如果里面出现大量 64 位十六进制字段、地址、WIF 形态字段,就应该按敏感材料处理。即使它很旧,也不要当普通垃圾删。
更稳妥的做法是:
~/Documents/加密资产/
这类文件迁过去以后,再决定是否加密归档、离线备份或彻底销毁。
Homebrew 大,不一定是 Homebrew 本身大
Apple Silicon Mac 当前 Homebrew 通常在:
/opt/homebrew
Intel 时代残留常见在:
/usr/local
先确认当前 brew:
which brew
brew --prefix
再看大小:
du -sh /opt/homebrew/* 2>/dev/null | sort -h
如果看到 /opt/homebrew 很大,不要马上 brew cleanup 后以为万事大吉。很多时候真正的大头在:
/opt/homebrew/var
这里可能是 MySQL、PostgreSQL、Redis、Kafka、RabbitMQ 等本地服务的数据和日志。brew cleanup 清的是旧版本、缓存、断链,清不了数据库数据。
MySQL binlog 是常见空间黑洞
本地 MySQL 数据目录常见位置:
/opt/homebrew/var/mysql
如果里面有很多 binlog.000xxx,每个几百 MB 到 1GB,很快就会堆出几十 GB。
先看体积:
du -ch /opt/homebrew/var/mysql/binlog.* 2>/dev/null | tail -1
ls -lh /opt/homebrew/var/mysql/binlog.* | tail -20
在线清理优先用 MySQL 命令:
PURGE BINARY LOGS TO 'binlog.000753';
或者按时间清:
PURGE BINARY LOGS BEFORE '2026-06-12 00:00:00';
不要直接删文件。直接删会让 binlog.index 和实际文件不一致。只有在本地开发库、MySQL 已停止、确认没有复制和恢复需求时,才考虑离线处理,并且必须同步更新 binlog.index。
给本地开发库设置 binlog 过期
清掉旧 binlog 只是一次性止血。更重要的是避免它继续无限增长。
Homebrew MySQL 配置一般在:
/opt/homebrew/etc/my.cnf
可以在 [mysqld] 下加:
# 本地开发库:binlog 最多保留 7 天,避免日志无限膨胀。
binlog_expire_logs_seconds = 604800
然后重启 MySQL:
brew services restart mysql
注意不要用 sudo brew services start mysql 启动 Homebrew MySQL。MySQL 会拒绝以 root 运行,还可能留下一个 root 的 LaunchDaemon 服务循环尝试启动。
服务状态用:
brew services list
看到类似下面这样才正常:
mysql started 用户名 ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
旧 /usr/local 要单独处理
Apple Silicon 机器上,如果当前 Homebrew 在 /opt/homebrew,但 /usr/local 还有旧 Homebrew 结构,那通常是 Intel 时代迁移残留。
可以先看:
du -sh /usr/local/* 2>/dev/null | sort -h
常见残留包括:
/usr/local/Homebrew/usr/local/var/usr/local/n/usr/local/bin/usr/local/lib/usr/local/share
这里不要整锅端。/usr/local/bin 里可能还有 JetBrains、VirtualBox 或你自己写过的脚本入口。清理前最好列出命令,再决定是否备份或移动。
推荐的清理顺序
我的顺序是:
- 先看根目录,确认没有异常顶层目录。
- 清用户根目录里的旧日志、旧下载、误装依赖。
- 敏感文件先迁移保留,不随手删。
- 清纯缓存,比如 Gradle、pnpm、npm、Flutter。
- 拆
/opt/homebrew/var,确认是否数据库或服务日志。 - 对 MySQL binlog 用正规方式清理,并设置过期。
- 最后再处理旧
/usr/local。
清理后要复扫
清理完不要只看 Finder 的可用空间。建议复扫:
df -h /System/Volumes/Data
du -sh /opt/homebrew /opt/homebrew/var/mysql /usr/local 2>/dev/null
brew services list
如果 MySQL、Redis、Nginx 等服务状态正常,binlog 没有继续暴涨,用户根目录没有大文件散落,这轮清理才算真正收口。
本地开发机清理最怕“爽删”。真正稳的做法,是先分类、再隔离、再删除;遇到数据库和密钥材料,宁可慢一点,也不要靠直觉动手。



