macos中du不支持按后缀筛选,需用find结合du统计:find /path -type f -name "*.log" -exec du -k {} + | awk '{sum+=$1} end {printf "total: %.0f kib\n", sum}'。

在 macOS 中,du 命令本身不支持直接按文件后缀筛选统计,但可以结合 find 实现“扫描指定后缀文件并计算其物理磁盘占用总和”。关键在于理解“物理占用”指文件实际占用的块(block)大小,而非逻辑大小(即 du -k 默认按 512 字节块计,macOS 中常用 -k 或 -h,且默认已四舍五入到块边界)。
用 find + du 统计某后缀所有文件的磁盘占用总和
推荐命令(以 .log 文件为例):
find /path/to/search -type f -name "*.log" -print0 | du -ckh --files0-from=-
-
find ... -print0安全输出含空格/特殊字符的路径,用 null 分隔 -
du -c末尾追加总计行(total) -
-k以 KiB(1024 字节)为单位;-h自动缩写(如 2.4M);两者可共存 -
--files0-from=-从标准输入读取 null 分隔的路径列表(GNU 扩展)——⚠️注意:macOS 自带的du(BSD 版本)不支持--files0-from
macOS 原生命令兼容方案(推荐)
由于 macOS 的 du 是 BSD 版本,需改用以下可靠写法:
find /path/to/search -type f -name "*.log" -exec du -k {} + | awk '{sum += $1} END {printf "Total: %.0f KiB\n", sum}'
-
-exec du -k {} +批量执行du -k,比\;高效得多 -
awk提取每行第一列(KiB 数值),累加并输出总和 - 若要显示人类可读格式(如 MB/GB),可在 awk 中换算:
printf "Total: %.2f GB\n", sum/1024/1024
排除符号链接、只统计真实文件大小
默认 find -type f 已跳过目录和符号链接,但若想确保不跟随 symlink(即不统计 link 指向的目标),无需额外操作;若误用了 -L,则会重复计算或越界。安全起见,保持无 -L 即可。
- 确认是否包含隐藏文件?
find默认包含以.开头的文件,无需额外选项 - 权限不足时部分文件会报错(如
Permission denied),加2>/dev/null可静默忽略 - 示例(安静执行 + GB 总和):
find ~/Documents -type f -name "*.psd" -exec du -k {} + 2>/dev/null | awk '{sum += $1} END {printf "PSD total: %.2f GB\n", sum/1024/1024}'
快速验证单个文件的物理占用 vs 逻辑大小
同一文件可能因稀疏、块对齐等导致物理占用(du)大于或等于逻辑大小(ls -l):
ls -lh file.txt # 显示逻辑大小(如 123B) du -kh file.txt # 显示磁盘占用(至少 4KB,因最小块大小)
- macOS 默认文件系统(APFS/HFS+)最小分配单元通常是 4KB,小于 4KB 的文件也占 4KB
-
du -k结果是向上取整到块边界的,不是简单字节数除以 1024 - 要查看精确块数和大小,可用:
stat -f "%z %b %k" file.txt(%z=字节大小,%b=占用块数,%k=块大小)










