不能用 du -sh 算平均值,因为 du 统计的是磁盘块占用而非文件逻辑大小,且会漏掉隐藏文件、输出格式不统一;正确方法是 find -type f -printf "%s\n" | awk '{sum+=$1;count++} end{print count?sum/count:0}'。

Linux 没有内置命令能直接输出「某个目录下所有文件的平均大小」,必须组合 find 和 awk 手动计算;用 du 会因块对齐、稀疏文件、文件系统差异导致结果失真,不能代表真实逻辑大小。
为什么不能用 du -sh 算平均值
du 统计的是磁盘占用(block-based),不是文件实际字节数。比如一个 1 字节的空文件,在 ext4 上可能占 4KB 块空间,du -b 仍可能返回 4096;而 find -printf "%s" 直接读取 inode 中的 st_size,才是真实逻辑大小。另外:du -sh */ 会漏掉隐藏文件(如 .git/)、无法排除目录、且输出格式不固定(带 K/M/G 后缀),awk 很难安全解析。
正确做法:用 find + awk 算字节级均值
执行以下命令即可获得纯数字结果(单位:字节):
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
find /path/to/dir -type f -printf "%s\n" | awk '{sum += $1; count++} END {if (count > 0) print sum/count; else print 0}'
-
-type f严格过滤普通文件,跳过目录、设备文件、socket、符号链接 -
-printf "%s\n"输出每个文件的st_size,不受块大小影响 - 管道进
awk累加并计数,END块处理除零保护 - 路径含空格或中文?
find原生支持,无需额外转义 - 权限不足时
find会报错但继续执行,加2>/dev/null可静默(注意:结果会偏低)
想看 KB 或 MB?在 awk 里做单位换算
别指望 du -h 或 numfmt,它们不接受管道输入。直接改 awk 表达式:
显示为 MB(二进制 MiB,保留一位小数):
find /path/to/dir -type f -printf "%s\n" | awk '{sum += $1; count++} END {if (count > 0) printf "%.1f MB\n", sum/(count*1024*1024); else print "0 MB"}'
- 用
1024*1024是 Linux 一贯的二进制单位习惯(MiB),不是十进制 MB - 若硬要十进制,换成
1000*1000,但注意这和du --si的行为才一致 - 0 字节文件默认计入——如需排除,加条件
if ($1 > 0) {sum += $1; count++}
真正容易被忽略的点是:平均值对极值敏感。一个 10GB 日志文件 + 一万个 1KB 配置文件,均值会被拉高到约 1MB,完全不能反映大多数文件的真实体量。真要评估分布,得配合 sort -n 和 head/tail 看中位数或分位数——但那就不是「平均大小」的问题了。










