字节笔记本
2026年8月30日
macOS 用 mdfind 秒查大文件
磁盘忽然红了,Storage 面板里又看不出是谁占的。macOS 上最快的办法往往不是 find 扫一遍盘,而是直接问 Spotlight 的命令行接口 mdfind:它读的是已经建好的元数据索引,按文件大小筛出来几乎是秒回。
一条命令找大于 1GB 的文件
核心属性是 kMDItemFSSize,单位是字节。查大于约 1GB 的文件可以这样写:
mdfind 'kMDItemFSSize > 1000000000'也可以用 shell 算术写整吉字节,避免自己数零:
mdfind "kMDItemFSSize > $[1024*1024*1024]"输出是完整路径列表。想只在某个目录里找,加上 -onlyin:
mdfind -onlyin "$HOME" 'kMDItemFSSize > 1000000000'只看当前用户目录,通常就够排查「我自己下的大包、虚拟机、Docker 数据」这类问题。
为什么比 find 快
find / -size +1G 要遍历文件系统,大盘上经常要跑几分钟,还容易撞上权限和挂载点。mdfind 走的是 Spotlight 索引(mds / mdworker),查询成本更接近「查数据库」而不是「扫磁盘」。
代价也清楚:
- 没被索引到的路径不会出现(隐私排除目录、部分系统文件、Trash 里个别项)
- 应用包(
.app)和虚拟机 bundle 可能被当成一个条目 - 索引落后时,刚复制进来的大文件可能暂时搜不到,等几秒或重建索引后再查
日常清盘够用;要做审计级「盘上每一个字节」的清单,再回头用 find 或专用工具。
常用变体
大于 100MB:
mdfind 'kMDItemFSSize > 100000000'在 Downloads 里找大于 500MB 的文件:
mdfind -onlyin ~/Downloads 'kMDItemFSSize > 500000000'把路径和大小一起打出来(对每个命中跑一次 mdls):
mdfind -onlyin "$HOME" 'kMDItemFSSize > 1000000000' \
| while IFS= read -r f; do
sz=$(mdls -name kMDItemFSSize -raw "$f" 2>/dev/null)
printf '%12s %s\n' "$sz" "$f"
done需要按大小排序时,可以把上面输出交给 sort -n。
复合条件用 && / ||。例如只看视频类大文件:
mdfind 'kMDItemFSSize > 500000000 && kMDItemContentTypeTree == "public.movie"'具体 ContentType 以本机 mdls 看到的为准,不同版本 macOS 标签会有细微差别。
查到大户之后怎么腾空间
mdfind 只负责定位。常见占空间来源和处理方式:
| 类型 | 常见路径 / 线索 | 处理思路 |
|---|---|---|
| Docker 镜像与层 | Docker.raw、~/Library/Containers/com.docker.docker | docker image prune / docker system prune(先确认不要的容器和卷) |
| 虚拟机 | ~/Virtual Machines.localized、*.vmwarevm | 删不用的虚拟机,或迁到外盘 |
| Xcode / 模拟器 | ~/Library/Developer | Xcode → Settings → Locations / Devices 里清旧 runtime |
| 安装包与 DMG | ~/Downloads | 装完就删安装包 |
| 休眠镜像等系统文件 | 系统路径 | 别乱删;优先清用户目录和容器数据 |
Tweet 里顺带提到的一行:
docker image prune会删掉未被任何容器引用的悬空镜像,经常能一次挤出好几 GB。更狠一点用 docker system prune -a(会动到未运行容器用过的镜像),执行前先 docker ps -a 看一眼。
和图形界面的关系
Finder 里 Spotlight 也可以按「文件大小」筛,适合随手点几下。mdfind 的优势是可脚本化、可限定目录、可和 mdls 拼成小工具。Storage 管理(关于本机 → 储存空间)适合看大类占比,定位具体路径还是命令行更快。
小结
硬盘告急时,先跑:
mdfind -onlyin "$HOME" 'kMDItemFSSize > 1000000000'看路径认人,再决定删镜像、迁虚拟机还是清下载目录。mdfind 吃的是 Spotlight 索引,所以快;它不是全盘审计,索引范围外的东西仍要用别的办法补。