Post

Mac 存储空间清理教程:找出 System Data 过大的真正原因

Mac 存储空间清理教程:找出 System Data 过大的真正原因

很多人清理 Mac 存储空间时,第一眼看到的都是这几个问题:

  • System Data 特别大
  • 系统设置里的分类看不懂
  • 明明没装多少东西,磁盘却快满了

如果这台 Mac 既是日常办公机,又装了 Xcode、iOS Simulator、Docker,空间异常膨胀的原因往往不是系统本身,而是开发环境留下的可再生数据。

这篇文章提供一套可复用、相对稳妥的排查与清理流程。先查清,再删除。所有 rm -rf 命令执行前,都建议二次确认路径。


一、先建立正确认知

在 macOS 里,System Data 并不等于系统文件本体

它经常还会包含这些内容:

  • Xcode 测试数据
  • Simulator 数据
  • 编译缓存
  • Docker 镜像与构建缓存
  • App 容器数据
  • 系统缓存和日志

所以,看到 System Data 很大,不要先怀疑系统坏了,先做排查。


二、先排除常见“大户”

1. 查看本地 Time Machine 快照

1
tmutil listlocalsnapshots /

如果输出了很多快照,说明本地快照占了一部分空间。 如果只有类似下面的提示而没有快照列表,这一项通常可以排除:

1
Snapshots for disk /:

2. 查看 iPhone/iPad 本地备份

1
du -sh ~/Library/Application\ Support/MobileSync/Backup

如果提示:

1
No such file or directory

说明没有本地 iPhone/iPad 备份目录,这一项也可以排除。


三、直接用 du 找真实占用源

系统设置的分类不一定精确,最直接的方法是统计 ~/Library 下各目录的实际大小。

先看重点目录:

1
2
3
4
5
du -sh ~/Library/Caches
du -sh ~/Library/Application\ Support
du -sh ~/Library/Developer
du -sh ~/Library/Containers
du -sh ~/Library/Group\ Containers

再看总体排名:

1
du -sh ~/Library/* 2>/dev/null | sort -hr | head -20

核心思路只有一句话:不看“系统怎么分类”,只看“谁实际占得最多”。


四、如果 ~/Library/Developer 很大,优先排查 Xcode 残留

如果 ~/Library/Developer 达到几十 GB 甚至上百 GB,大概率是 Xcode 或测试环境数据。

继续执行:

1
2
du -sh ~/Library/Developer/* 2>/dev/null | sort -hr
du -sh ~/Library/Developer/Xcode/* 2>/dev/null | sort -hr

重点关注:

  • ~/Library/Developer/XCTestDevices
  • ~/Library/Developer/CoreSimulator
  • ~/Library/Developer/Xcode/DerivedData

它们通常对应:

1. XCTestDevices

Xcode 测试运行相关数据。这个目录异常变大时,常见原因是测试设备残留、测试缓存累积,或异常测试后遗留的大量派生数据。

2. CoreSimulator

iOS 模拟器数据,包括模拟器设备、设备内 App 数据、模拟器系统环境。

3. DerivedData

Xcode 编译缓存目录。通常可以直接删除,是最常见且相对安全的清理项之一。


五、如何相对安全地清理 Xcode/Simulator 占用

开始前请先退出:

  • Xcode
  • Simulator
  • Instruments
  • 正在跑测试的终端窗口

1. 清理 DerivedData

这是通常最安全的一项:

1
rm -rf ~/Library/Developer/Xcode/DerivedData

删除后不影响源码,只会让下次编译变慢一些。

2. 清理不可用模拟器

1
xcrun simctl delete unavailable

这条命令会删除已无效、不可用的模拟器数据,通常较安全。

3. 彻底清理模拟器设备数据

如果 CoreSimulator 仍然很大:

1
rm -rf ~/Library/Developer/CoreSimulator/Devices/*

这会清空模拟器设备及其 App 数据,影响包括:

  • 模拟器回到较干净状态
  • 模拟器中的登录状态、缓存、测试数据会丢失
  • 不影响项目源码

4. 清理 XCTestDevices

如果这一项特别大(比如几十 GB、上百 GB),优先处理。

先看具体占用:

1
du -sh ~/Library/Developer/XCTestDevices/* 2>/dev/null | sort -hr | head -30

更稳妥的方式是先备份再观察:

1
2
mv ~/Library/Developer/XCTestDevices ~/Library/Developer/XCTestDevices.backup
mkdir -p ~/Library/Developer/XCTestDevices

确认 Xcode 正常后,再删除备份:

1
rm -rf ~/Library/Developer/XCTestDevices.backup

如果你已确认只是残留缓存,也可以直接清空:

1
rm -rf ~/Library/Developer/XCTestDevices/*

六、如果 ~/Library/Containers 很大,重点看 Docker 和聊天软件

另一个常见大户是:

1
~/Library/Containers

可用下面命令快速查看:

1
du -sh ~/Library/Containers/* 2>/dev/null | sort -hr | head -30

常见目录包括:

  • com.docker.docker
  • com.tencent.xinWeChat
  • Telegram、邮件、网盘等应用容器

七、Docker 占用很高时,怎么清理

如果 ~/Library/Containers/com.docker.docker 很大(比如十几 GB 到几十 GB),先看结构:

1
docker system df

重点看:

  • Images
  • Build Cache

如果大部分是 RECLAIMABLE,说明这些空间基本可回收。

1. 先清理 Build Cache

1
docker builder prune -a

2. 再清理未使用镜像

1
docker image prune -a

这会删除未被当前容器使用的镜像。

3. 或者一步清理大部分可回收内容

1
docker system prune -a

通常会清理:

  • 未使用镜像
  • 构建缓存
  • 已停止容器
  • 未使用网络

4. 不建议一开始就加 --volumes

1
docker system prune -a --volumes

这条命令更激进,会连 volume 一起清理。volume 里可能有:

  • 数据库数据
  • 项目持久化数据
  • 容器业务文件

除非你非常确定 volume 没有重要数据,否则先不要使用。


八、如何确认空间是否真的释放

清理后不要只看系统设置的颜色条,最好在终端再确认一次。

1. 查看根卷空间

1
df -h /

重点看:SizeUsedAvailCapacity

2. 再看 Developer 是否明显下降

1
2
du -sh ~/Library/Developer
du -sh ~/Library/Developer/* 2>/dev/null | sort -hr

3. 必要时重启一次 Mac

macOS 的存储分类页面不是总会即时刷新。有时需要等待几分钟,或重启后再看:

系统设置 -> 通用 -> 储存


九、一套推荐的排查顺序(可直接照做)

第一步:排除常见来源

1
2
tmutil listlocalsnapshots /
du -sh ~/Library/Application\ Support/MobileSync/Backup

第二步:定位 ~/Library 下的大目录

1
du -sh ~/Library/* 2>/dev/null | sort -hr | head -20

第三步:如果 Developer 很大,继续细查

1
2
du -sh ~/Library/Developer/* 2>/dev/null | sort -hr
du -sh ~/Library/Developer/Xcode/* 2>/dev/null | sort -hr

第四步:清理 Xcode/Simulator 残留

1
2
3
rm -rf ~/Library/Developer/Xcode/DerivedData
xcrun simctl delete unavailable
rm -rf ~/Library/Developer/CoreSimulator/Devices/*

XCTestDevices 特别大,再处理:

1
rm -rf ~/Library/Developer/XCTestDevices/*

第五步:检查 Docker

1
2
du -sh ~/Library/Containers/* 2>/dev/null | sort -hr | head -30
docker system df

第六步:清理 Docker 缓存与镜像

1
2
3
docker builder prune -a
docker image prune -a
docker system prune -a

十、哪些可以删,哪些要谨慎

一般可以删

  • ~/Library/Developer/Xcode/DerivedData
  • 不再需要的 Simulator 数据
  • XCTestDevices 残留
  • Docker Build Cache
  • 未使用的 Docker 镜像

需要谨慎处理

  • Docker volumes
  • ~/Library/Application Support 里的应用数据
  • 聊天软件本地数据
  • 你不确定用途的数据库文件

不建议乱删

  • /System
  • /Library 下不认识的系统文件
  • 不明来源的配置和驱动文件

十一、结论

如果你的 Mac 是开发机,遇到 System Data 过大 时,优先排查的通常不是系统本身,而是:

  • ~/Library/Developer/XCTestDevices
  • ~/Library/Developer/CoreSimulator
  • ~/Library/Developer/Xcode/DerivedData
  • ~/Library/Containers/com.docker.docker

真正有效的清理方法,不是盯着系统设置里的颜色条,而是:

du 找出最大目录,再有针对性地清理可再生数据。

这样更安全,也更高效。


附:本文命令汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tmutil listlocalsnapshots /
du -sh ~/Library/Application\ Support/MobileSync/Backup

du -sh ~/Library/Caches
du -sh ~/Library/Application\ Support
du -sh ~/Library/Developer
du -sh ~/Library/Containers
du -sh ~/Library/Group\ Containers
du -sh ~/Library/* 2>/dev/null | sort -hr | head -20

du -sh ~/Library/Developer/* 2>/dev/null | sort -hr
du -sh ~/Library/Developer/Xcode/* 2>/dev/null | sort -hr
du -sh ~/Library/Containers/* 2>/dev/null | sort -hr | head -30

rm -rf ~/Library/Developer/Xcode/DerivedData
xcrun simctl delete unavailable
rm -rf ~/Library/Developer/CoreSimulator/Devices/*
rm -rf ~/Library/Developer/XCTestDevices/*

docker system df
docker builder prune -a
docker image prune -a
docker system prune -a

df -h /
This post is licensed under CC BY 4.0 by the author.