1. 从一次真实的磁盘告警说起
那天下午正编译着项目,Xcode 突然弹出一个磁盘空间不足的提示,我瞄了一眼关于本机,系统数据那一栏赫然写着 187GB。第一反应是 Time Machine 的本地快照堆积了,但清理完快照之后,系统数据依然纹丝不动。后来花了整整一个周末,把能翻的目录全翻了一遍,才把这块硬骨头啃下来。这篇文章就是那次排查的完整记录,我会把每一个步骤、每一条命令、每一个踩过的坑都写清楚,你照着做就行。
Mac 的“系统数据”这个分类其实是个筐,苹果把很多不方便归类的占用都扔进去了,包括缓存、日志、快照、旧系统残留、Xcode 的派生数据、Docker 镜像、甚至一些第三方应用的沙盒数据。所以当你看到系统数据占了上百 G,不要慌,它大概率不是真的“系统”在用,而是各种临时文件和缓存堆积的结果。这篇文章适合所有用 Mac 做开发或者日常办公、发现磁盘空间莫名其妙被吃掉的朋友,不管你是刚入门的小白还是用了多年 Mac 的老手,都能从里面找到能直接用的清理方案。
2. 先搞清楚磁盘空间到底被谁吃了
2.1 系统数据到底是什么
很多人看到“系统数据”四个字就以为是 macOS 本身占的,其实不是。在 macOS Ventura 之后的版本里,存储空间分类中的“系统数据”包含了以下几类内容:
- 缓存文件:包括系统缓存、应用缓存、浏览器缓存等,路径通常在
~/Library/Caches和/Library/Caches - 日志文件:系统和应用的运行日志,路径在
~/Library/Logs和/var/log - Time Machine 本地快照:当外接备份盘不在身边时,macOS 会在本地磁盘上创建快照,这些快照可能占用几十甚至上百 G
- Xcode 相关文件:派生数据、归档、模拟器运行时、设备支持文件等,这部分对 iOS 开发者来说是大头
- 旧系统残留:系统升级后留下的旧版本文件,路径在
/System/Volumes/Data下的隐藏目录 - 第三方应用数据:Docker 镜像、虚拟机磁盘、Adobe 缓存等
注意:系统数据的大小是动态变化的,你今天看到 100G,明天可能变成 80G,因为系统会自动清理一部分缓存。但如果它持续增长不下降,那就说明有东西在持续写入。
2.2 用系统自带工具做初步排查
在动手清理之前,先做一次全面排查,搞清楚空间到底去哪了。macOS 自带的存储管理工具可以给你一个大致的方向:
打开“系统设置” → “通用” → “存储空间”,等待系统扫描完成。这里你会看到各个分类的占用情况。点击“系统数据”旁边的信息按钮,系统会列出一些大文件,但这个列表往往不完整。
更精确的方式是用命令行。打开终端,先看看根目录下各个大目录的占用:
sudo du -sh /System/Volumes/Data/* 2>/dev/null | sort -rh | head -20这条命令会列出数据卷下所有一级目录的大小,按从大到小排序。注意sudo是必须的,因为很多目录需要 root 权限才能读取。执行时间可能比较长,耐心等。
然后看看用户目录下的情况:
du -sh ~/Library/* 2>/dev/null | sort -rh | head -20这两条命令跑完,你基本就能定位到空间被哪个目录吃掉了。我第一次跑的时候,发现~/Library/Developer占了 60 多 G,~/Library/Containers占了 30 多 G,问题一下就清晰了。
2.3 用第三方工具做可视化分析
命令行虽然精确,但不够直观。推荐几个免费的可视化磁盘分析工具:
- GrandPerspective:开源免费,扫描后以矩形树图展示文件占用,一眼就能看出哪个文件夹最大
- OmniDiskSweeper:免费版就够用,按大小排序列出所有文件,支持直接删除
- DaisyDisk:付费但体验最好,界面漂亮,扫描速度快
我个人习惯用 GrandPerspective,扫描整个磁盘后,那些巨大的色块就是占用大户。点进去就能一层层展开,找到具体的文件。这个工具的好处是它直接读取文件系统的元数据,不会像 Finder 那样漏掉隐藏文件。
实操心得:扫描的时候不要扫整个磁盘,先扫
~/Library和/Library这两个目录,90% 的问题都出在这里。全盘扫描太慢,而且系统目录你也不能随便动。
3. 逐项击破:系统数据清理实战
3.1 Time Machine 本地快照清理
Time Machine 本地快照是我遇到的第一个大头。当你开启了 Time Machine 但没有连接备份盘时,macOS 会自动在本地创建快照,这些快照会随着时间推移不断累积。我见过最夸张的情况,本地快照占了 200 多 G。
先查看当前有哪些快照:
tmutil listlocalsnapshots /你会看到类似这样的输出:
com.apple.TimeMachine.2024-01-15-103045.local com.apple.TimeMachine.2024-01-16-142230.local com.apple.TimeMachine.2024-01-17-091512.local每个快照后面都有时间戳。删除单个快照:
sudo tmutil deletelocalsnapshots 2024-01-15-103045如果你想一次性删除所有本地快照:
sudo tmutil deletelocalsnapshots /注意:删除本地快照不会影响你已有的 Time Machine 备份,只是删掉了本地磁盘上的临时快照。但删除后,如果你没有连接备份盘,这段时间的数据就没有备份保护了。
我一般会保留最近两三天的快照,把更早的删掉。这样既释放了空间,又保留了一定的本地恢复能力。
另外,如果你根本不用 Time Machine,可以直接关闭本地快照功能:
sudo tmutil disablelocal不过在较新的 macOS 版本中,这个命令可能已经失效,系统会自动管理快照。更稳妥的方式是定期手动清理。
3.2 Xcode 缓存与派生数据清理
如果你是 iOS 开发者,Xcode 绝对是磁盘空间的第一大杀手。Xcode 会在多个位置存放文件,每一个都可能占用大量空间。
派生数据(DerivedData)是 Xcode 存放编译中间产物的地方,路径在~/Library/Developer/Xcode/DerivedData。这个目录可以安全删除,Xcode 会在下次编译时重新生成。我见过这个目录占到 50G 以上的情况。
rm -rf ~/Library/Developer/Xcode/DerivedData/*归档文件(Archives)存放的是你打包上架的 .xcarchive 文件,路径在~/Library/Developer/Xcode/Archives。这些文件用于符号化崩溃日志和重新导出 IPA,建议保留最近几个月的,旧的可以删掉。每个归档文件可能几百 M 到几个 G。
du -sh ~/Library/Developer/Xcode/Archives/*查看每个归档的大小后,手动删除不需要的。
iOS 设备支持文件(iOS DeviceSupport)路径在~/Library/Developer/Xcode/iOS DeviceSupport。每次你连接一个新版本的 iOS 设备,Xcode 都会下载对应的符号文件,每个版本大概 2-4G。如果你支持很多 iOS 版本,这个目录会非常大。
du -sh ~/Library/Developer/Xcode/iOS\ DeviceSupport/*删除旧版本的支持文件,只保留你当前需要调试的版本。
模拟器运行时(Simulators)路径在~/Library/Developer/CoreSimulator/Devices。每个模拟器实例都是一个完整的系统镜像,占用几个 G。你可以通过 Xcode 的 Devices and Simulators 窗口删除不用的模拟器,也可以用命令行:
xcrun simctl delete unavailable这条命令会删除所有不可用的模拟器(比如旧 iOS 版本对应的)。
Xcode 缓存还包括~/Library/Caches/com.apple.dt.Xcode和~/Library/Developer/Xcode/UserData,前者是缓存,后者是配置,缓存可以删,配置建议保留。
实操心得:我写了一个脚本,每次 Xcode 大版本更新后跑一次,自动清理 DerivedData 和旧的 DeviceSupport。这个习惯帮我省下了至少 100G 的空间。脚本很简单,就是几行 rm 命令,你可以根据自己的情况调整。
3.3 缓存与日志文件的系统化清理
~/Library/Caches是缓存文件的大本营,几乎所有应用都会在这里建一个自己的目录。这个目录可以安全删除,应用会在需要时重新生成缓存。但要注意,删除后第一次打开应用可能会慢一些。
先看看哪些应用的缓存最大:
du -sh ~/Library/Caches/* 2>/dev/null | sort -rh | head -20常见的缓存大户包括:
- Google Chrome:浏览器缓存,可能几个 G
- Spotify:离线歌曲缓存
- Adobe:各种 Creative Cloud 应用的缓存
- Docker:镜像层缓存
- Homebrew:下载的安装包缓存
对于浏览器缓存,建议直接在浏览器设置里清理,而不是手动删目录。对于其他应用,可以手动删除对应的缓存目录。
~/Library/Logs存放的是应用日志,通常不会太大,但有些应用会疯狂写日志。同样先查看大小:
du -sh ~/Library/Logs/* 2>/dev/null | sort -rh | head -20日志文件可以直接删除,不影响应用运行。
系统级别的日志在/var/log和/private/var/log,这些需要 sudo 权限。不过系统日志通常有自动轮转机制,不会无限增长。
注意:不要删除
/Library/Caches下的所有内容,有些系统级缓存删了之后会导致某些功能异常。建议只删除你认识的、确定是第三方应用的缓存目录。
3.4 Docker 与虚拟机磁盘清理
如果你用 Docker 做开发,Docker 的磁盘占用可能非常惊人。Docker 在 Mac 上实际是运行在一个 Linux 虚拟机里的,所有镜像、容器、卷都存放在虚拟磁盘文件中,路径通常在~/Library/Containers/com.docker.docker/Data/vms。
先看看 Docker 的磁盘使用情况:
docker system df这会显示镜像、容器、卷和构建缓存各自占用的空间。然后可以逐项清理:
# 删除所有未使用的镜像 docker image prune -a # 删除所有停止的容器 docker container prune # 删除所有未使用的卷 docker volume prune # 删除所有未使用的网络 docker network prune # 一键清理所有未使用的资源 docker system prune -a --volumes最后那条命令会删除所有未使用的镜像、容器、卷和网络,慎用,但效果最彻底。我一般每个月跑一次,能释放十几 G 的空间。
如果你用 Parallels Desktop 或 VMware Fusion 跑虚拟机,虚拟磁盘文件(.pvm 或 .vmwarevm)也可能占用几十 G。这些文件在~/Documents/Parallels或~/Virtual Machines.localized下。如果虚拟机里有快照,快照文件也会占用大量空间。建议在虚拟机软件里管理快照,删除不需要的。
3.5 旧系统残留与 iOS 备份清理
macOS 每次大版本升级后,旧系统的文件不会立即删除,而是保留一段时间以便回滚。这些文件在/System/Volumes/Data下的隐藏目录中,比如Previous System或macOS Install Data。
查看这些目录:
sudo ls -la /System/Volumes/Data/如果你确定不需要回滚,可以删除这些残留。但操作要非常小心,不要删错文件。
另一个容易被忽略的大户是iOS 备份。当你用 Finder 或 iTunes 备份 iPhone 时,备份文件存放在~/Library/Application Support/MobileSync/Backup。每个备份可能几 G 到几十 G,而且旧备份不会自动删除。
du -sh ~/Library/Application\ Support/MobileSync/Backup/*查看每个备份的大小和日期,删除不需要的旧备份。你也可以在 Finder 的“管理备份”中删除。
3.6 其他常见占用大户
还有一些零散但可能很大的占用:
邮件附件:如果你用 Mail.app,附件缓存在~/Library/Containers/com.apple.mail/Data/Library/Mail Downloads,可能积累很多。
照片图库:如果你开启了 iCloud 照片的“优化 Mac 存储空间”,原始照片会上传到云端,本地只保留缩略图。但如果没开启,照片图库可能非常大。检查~/Pictures/Photos Library.photoslibrary的大小。
下载文件夹:这个不用多说,定期清理。
废纸篓:删除文件后别忘了清空废纸篓,特别是从外接磁盘删除的文件,可能还在废纸篓里占着空间。
Adobe 缓存:如果你用 Adobe 全家桶,~/Library/Application Support/Adobe/Common/Media Cache Files可能很大。
Steam 游戏:如果你在 Mac 上玩游戏,Steam 的游戏文件在~/Library/Application Support/Steam/steamapps,不玩的游戏可以卸载。
4. 建立长效的磁盘空间管理机制
4.1 定期清理的自动化方案
手动清理一次能解决问题,但过几个月又会堆积。最好的办法是建立定期清理机制。我自己的做法是写一个 shell 脚本,每月跑一次,自动清理那些确定安全的目录。
#!/bin/bash echo "开始清理..." # 清理 Xcode DerivedData rm -rf ~/Library/Developer/Xcode/DerivedData/* echo "DerivedData 已清理" # 清理不可用的模拟器 xcrun simctl delete unavailable echo "不可用模拟器已清理" # 清理 Homebrew 缓存 brew cleanup -s echo "Homebrew 缓存已清理" # 清理 Docker 未使用资源 docker system prune -f echo "Docker 未使用资源已清理" # 清理旧的日志文件 find ~/Library/Logs -name "*.log" -mtime +30 -delete echo "旧日志已清理" # 清理废纸篓 rm -rf ~/.Trash/* echo "废纸篓已清空" echo "清理完成"把这个脚本保存为cleanup.sh,加上执行权限,每月手动跑一次或者用 launchd 定时执行。注意脚本里没有删除缓存目录,因为缓存删了之后应用会重新生成,频繁删除反而影响使用体验。
实操心得:不要用那些一键清理的第三方工具,它们往往清理不彻底,还可能误删重要文件。自己写脚本,清楚每一行在做什么,才是最安全的。
4.2 监控磁盘空间的预警设置
与其等到磁盘满了再清理,不如提前设置预警。macOS 没有内置的磁盘空间预警功能,但你可以用一些简单的方法实现。
方法一:在终端里加一个别名,每次打开终端时显示磁盘使用情况。编辑~/.zshrc,加入:
alias df='df -h /System/Volumes/Data | tail -1'这样每次输入df就能快速查看。
方法二:用 launchd 定时检查,当磁盘使用超过 85% 时发送通知。这个需要写一个 plist 文件,稍微复杂一些,但一劳永逸。
方法三:用第三方工具如 Sensei 或 CleanMyMac 的监控功能,它们会在菜单栏显示磁盘使用情况,并在空间不足时提醒你。
我个人的习惯是每周瞄一眼存储空间,发现系统数据超过 50G 就手动清理一次。这个阈值你可以根据自己的磁盘大小调整。
4.3 养成不堆积文件的日常习惯
清理是治标,不堆积才是治本。几个日常习惯能帮你省下很多空间:
- 下载文件夹每周清空一次:下载的东西要么归档,要么删除,不要一直堆着
- Xcode 项目定期清理:不活跃的项目直接删掉 DerivedData,或者用
xcodebuild clean清理 - Docker 镜像用完就删:不要留着几十个没用过的镜像
- 截图和录屏及时处理:桌面上的截图文件很容易积累,设一个文件夹定期整理
- 大文件用外接硬盘:视频素材、虚拟机磁盘这些大文件放在外接硬盘上,不要占内置磁盘
这些习惯看起来简单,但坚持下来效果非常明显。我现在的 Mac 用了两年,系统数据一直控制在 30G 以内,再也没有出现过磁盘告警。
5. 常见问题与排查技巧实录
5.1 清理后空间没有释放怎么办
这是最常见的问题。你删了一堆文件,但存储空间显示没有变化。原因通常有几个:
废纸篓没清空:从 Finder 删除的文件会先进废纸篓,必须清空废纸篓才能真正释放空间。从终端用rm删除的文件不进废纸篓,直接释放。
Time Machine 本地快照:即使你删了文件,如果本地快照还在,空间不会释放。因为快照里还保留着这些文件的副本。必须先删除快照。
文件被进程占用:如果某个文件正在被进程使用,删除后空间不会立即释放,要等进程结束。可以用lsof | grep deleted查看被删除但仍在占用的文件。
APFS 快照:APFS 文件系统的快照机制可能导致空间延迟释放。重启电脑通常能解决。
系统缓存:macOS 会缓存一些磁盘操作,空间显示可能滞后。等几分钟或者重启。
排查顺序:先清空废纸篓,再检查本地快照,然后重启电脑。90% 的情况这三步就能解决。
5.2 哪些目录绝对不能删
清理磁盘空间时,有些目录是绝对不能碰的,删了会导致系统或应用无法正常运行:
| 目录 | 说明 |
|---|---|
/System | 系统核心文件,只读卷,正常也删不了 |
/Library/Extensions | 系统扩展,删了可能导致硬件无法工作 |
~/Library/Preferences | 应用偏好设置,删了所有应用都要重新配置 |
~/Library/Keychains | 钥匙串,删了所有密码都没了 |
~/Library/Application Support | 应用数据,删了应用可能丢失配置和数据 |
~/Library/Containers | 沙盒应用数据,删了应用数据全丢 |
/private/var/db | 系统数据库,删了系统可能无法启动 |
注意:
~/Library/Caches可以删,~/Library/Application Support不能随便删。这两个目录名字很像,但性质完全不同。缓存删了会自动重建,应用数据删了就真没了。
5.3 系统数据反复增长怎么排查
如果你清理完没几天,系统数据又涨回来了,说明有东西在持续写入。排查方法:
先用sudo fs_usage监控文件系统活动,看看哪个进程在疯狂写文件。这个命令输出很快,可以用grep过滤:
sudo fs_usage | grep -E "write|create"然后观察哪些进程频繁出现。常见的罪魁祸首包括:
- Spotlight 索引:如果索引损坏,会反复重建,导致大量磁盘写入。可以用
mdutil -E /重建索引 - iCloud 同步:如果同步卡住了,会反复尝试,产生大量日志和临时文件
- 日志失控的应用:某些应用会疯狂写日志,用
du -sh ~/Library/Logs/*查看 - Docker:如果容器在持续运行并写日志,Docker 虚拟磁盘会不断增长
找到罪魁祸首后,针对性解决。如果是应用的问题,考虑更新或替换该应用。
5.4 清理工具的选择与避坑
市面上有很多 Mac 清理工具,质量参差不齐。我的建议是:
推荐用的:
- GrandPerspective:磁盘分析,开源免费
- OmniDiskSweeper:磁盘分析,免费版够用
- DaisyDisk:磁盘分析,付费但好用
- AppCleaner:卸载应用时清理残留,免费
谨慎用的:
- CleanMyMac:功能全但激进,可能误删,建议只用它的卸载和监控功能
- MacKeeper:口碑差,不推荐
- 各种“一键加速”工具:往往只是清理缓存,效果有限,还可能带来隐私问题
实操心得:我从来不用一键清理工具,因为我不清楚它到底删了什么。自己用命令行和 GrandPerspective 分析,手动删除,虽然麻烦一点,但安全可控。磁盘清理这件事,宁可慢一点,也不要冒险。
5.5 磁盘空间不足时的紧急处理
如果你现在磁盘已经满了,系统卡顿甚至无法操作,需要紧急释放空间,按以下优先级处理:
- 清空废纸篓:最快,可能立即释放几 G 到几十 G
- 删除 Time Machine 本地快照:
sudo tmutil deletelocalsnapshots /,通常能释放大量空间 - 删除 Xcode DerivedData:
rm -rf ~/Library/Developer/Xcode/DerivedData/* - 清理 Docker:
docker system prune -a --volumes - 删除下载文件夹和桌面的大文件
- 清理浏览器缓存
这六步做完,通常能释放至少 50G 的空间。如果还不够,再用 GrandPerspective 深入分析。
6. 我的个人清理流程与工具清单
经过多次实践,我总结出了一套固定的清理流程,每次磁盘告警时按顺序执行,基本能在半小时内解决问题。
第一步:快速诊断(5 分钟)
打开 GrandPerspective 扫描~/Library,同时用du -sh命令查看几个关键目录的大小。确定主要占用来源。
第二步:清理快照和废纸篓(2 分钟)
sudo tmutil deletelocalsnapshots / rm -rf ~/.Trash/*第三步:清理开发相关缓存(10 分钟)
rm -rf ~/Library/Developer/Xcode/DerivedData/* xcrun simctl delete unavailable docker system prune -a --volumes brew cleanup -s第四步:清理应用缓存和日志(5 分钟)
用 GrandPerspective 找出~/Library/Caches下最大的几个目录,手动删除。清理~/Library/Logs下的旧日志。
第五步:检查大文件(5 分钟)
用 GrandPerspective 扫描整个用户目录,找出超过 1G 的文件,逐个判断是否需要保留。
第六步:重启并验证(3 分钟)
重启电脑,让系统释放被占用的空间,然后查看存储空间确认清理效果。
这套流程我跑了不下十次,每次都能把系统数据从 100G 以上降到 30G 以内。工具清单也很简单:GrandPerspective、终端、加上几个命令行工具,不需要任何付费软件。
最后分享一个小技巧:如果你不确定某个文件能不能删,先把它移到外接硬盘或者另一个分区,用几天看看系统有没有异常。确认没问题后再彻底删除。这个“缓刑”策略帮我避免了好几次误删。
磁盘清理这件事,说到底就是搞清楚什么东西在占空间,然后判断哪些可以安全删除。没有魔法,也不需要什么高级工具,耐心加细心就够了。