macOS 上 du 默认较慢,优化需跳过 Spotlight 等元数据目录、禁用 xattr/ACL 扫描、加 -xdev 限制跨卷、用 --max-depth 分层定位、优先调用 APFS 原生统计命令。

du 在 macOS 上默认行为较慢,尤其在 SSD 上遍历大量小文件时,主要受限于系统级元数据访问策略和默认的 I/O 调度方式。优化核心是减少不必要的磁盘寻址、绕过 Spotlight 和元数据代理开销,并适配 SSD 的随机读取优势。
跳过 .Spotlight-V100 和其他元数据目录
macOS 的 Spotlight 索引目录(.Spotlight-V100)、Time Machine 元数据(.fseventsd、.metadata_never_index)以及 APFS 快照目录(如 .apdisk)会显著拖慢 du。它们本身不存用户数据,但 du 默认仍递归进入并尝试统计。
- 用
--exclude显式跳过:du -sh --exclude=".Spotlight-V100" --exclude=".fseventsd" --exclude=".apdisk" --exclude=".Trashes" /path/to/dir - 更彻底的方式是结合
find过滤后再统计:find /path/to/dir -xdev -not -name ".Spotlight-V100" -not -name ".fseventsd" -not -name ".apdisk" -type f -print0 | du -ch --files0-from=- | tail -1
禁用 ACL 和扩展属性扫描
macOS 默认为每个文件附加扩展属性(xattr)和 ACL 权限信息,du 在统计时会尝试读取这些元数据,造成大量额外 getxattr 系统调用,在 SSD 上虽延迟低,但高并发小请求仍累积明显开销。
- 添加
-P(物理链接,不解析符号链接)和--apparent-size可跳过部分 xattr 解析逻辑 - 更有效的是用
stat+awk绕过du:find /path/to/dir -xdev -type f -exec stat -f "%z" {} \; | awk '{s+=$1} END {printf "%.2f MB\n", s/1024/1024}'
限制深度与合理使用 -xdev
SSD 虽快,但跨卷(如挂载的外置硬盘、网络盘、APFS 快照卷)会触发实际 I/O 切换,du 默认不区分设备,容易误入慢速路径。
- 始终加上
-xdev(等价于-x),确保只统计当前文件系统 - 对深层目录结构,用
--max-depth=1先定位大目录,再逐层下钻,避免全量扫描:du -sh --max-depth=1 /path/to/dir | sort -hr | head -20 - 若只需总大小,加
-s避免输出中间层级,减少终端渲染开销
利用 APFS 原生特性替代 du
APFS 卷自带空间统计(diskutil apfs list、df -h),对顶层卷或已知目录,可直接查元数据而非实时遍历:
- 查看某目录所在卷的已用空间:
df -h /path/to/dir - 获取 APFS 快照空间占用:
diskutil apfs list | grep -A 10 "Snapshots" - 对 Time Machine 备份目录,用
tmutil calculatedrift或tmutil compare比增量更高效











