ByteNoteByteNote

字节笔记本

2026年8月30日

macOS 用 mdfind 秒查大文件

API中转
¥120

磁盘忽然红了,Storage 面板里又看不出是谁占的。macOS 上最快的办法往往不是 find 扫一遍盘,而是直接问 Spotlight 的命令行接口 mdfind:它读的是已经建好的元数据索引,按文件大小筛出来几乎是秒回。

一条命令找大于 1GB 的文件

核心属性是 kMDItemFSSize,单位是字节。查大于约 1GB 的文件可以这样写:

bash
mdfind 'kMDItemFSSize > 1000000000'

也可以用 shell 算术写整吉字节,避免自己数零:

bash
mdfind "kMDItemFSSize > $[1024*1024*1024]"

输出是完整路径列表。想只在某个目录里找,加上 -onlyin

bash
mdfind -onlyin "$HOME" 'kMDItemFSSize > 1000000000'

只看当前用户目录,通常就够排查「我自己下的大包、虚拟机、Docker 数据」这类问题。

为什么比 find 快

find / -size +1G 要遍历文件系统,大盘上经常要跑几分钟,还容易撞上权限和挂载点。mdfind 走的是 Spotlight 索引(mds / mdworker),查询成本更接近「查数据库」而不是「扫磁盘」。

代价也清楚:

  • 没被索引到的路径不会出现(隐私排除目录、部分系统文件、Trash 里个别项)
  • 应用包(.app)和虚拟机 bundle 可能被当成一个条目
  • 索引落后时,刚复制进来的大文件可能暂时搜不到,等几秒或重建索引后再查

日常清盘够用;要做审计级「盘上每一个字节」的清单,再回头用 find 或专用工具。

常用变体

大于 100MB:

bash
mdfind 'kMDItemFSSize > 100000000'

在 Downloads 里找大于 500MB 的文件:

bash
mdfind -onlyin ~/Downloads 'kMDItemFSSize > 500000000'

把路径和大小一起打出来(对每个命中跑一次 mdls):

bash
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

复合条件用 && / ||。例如只看视频类大文件:

bash
mdfind 'kMDItemFSSize > 500000000 && kMDItemContentTypeTree == "public.movie"'

具体 ContentType 以本机 mdls 看到的为准,不同版本 macOS 标签会有细微差别。

查到大户之后怎么腾空间

mdfind 只负责定位。常见占空间来源和处理方式:

类型常见路径 / 线索处理思路
Docker 镜像与层Docker.raw~/Library/Containers/com.docker.dockerdocker image prune / docker system prune(先确认不要的容器和卷)
虚拟机~/Virtual Machines.localized*.vmwarevm删不用的虚拟机,或迁到外盘
Xcode / 模拟器~/Library/DeveloperXcode → Settings → Locations / Devices 里清旧 runtime
安装包与 DMG~/Downloads装完就删安装包
休眠镜像等系统文件系统路径别乱删;优先清用户目录和容器数据

Tweet 里顺带提到的一行:

bash
docker image prune

会删掉未被任何容器引用的悬空镜像,经常能一次挤出好几 GB。更狠一点用 docker system prune -a(会动到未运行容器用过的镜像),执行前先 docker ps -a 看一眼。

和图形界面的关系

Finder 里 Spotlight 也可以按「文件大小」筛,适合随手点几下。mdfind 的优势是可脚本化、可限定目录、可和 mdls 拼成小工具。Storage 管理(关于本机 → 储存空间)适合看大类占比,定位具体路径还是命令行更快。

小结

硬盘告急时,先跑:

bash
mdfind -onlyin "$HOME" 'kMDItemFSSize > 1000000000'

看路径认人,再决定删镜像、迁虚拟机还是清下载目录。mdfind 吃的是 Spotlight 索引,所以快;它不是全盘审计,索引范围外的东西仍要用别的办法补。

分享: