du命令不直接支持按扩展名统计,但可通过find、awk、sort等组合实现:如统计.log文件总大小用find+du-ch+tail;分组统计前5大类型用find+awk提取扩展名+uniq-c+sort-nr;生成带大小的分布报告用find-printff+awk求和+sort-hr;排除干扰文件则结合find过滤与file判别内容类型。

du 命令本身不直接支持按文件类型(如 .log、.tar.gz)分类统计,但可以通过组合 shell 工具实现精准的按扩展名分组汇总。关键在于:先用 find 筛出特定类型文件,再交由 du 计算大小,最后用 awk 或 sort 聚合。
统计当前目录下所有 .log 文件总大小
最常用场景,一步到位:
find . -type f -name "*.log" -print0 | du -ch --files0-from=- | tail -n1
说明:-print0 和 --files0-from=- 配合可安全处理含空格或特殊字符的文件名;-c 输出总计,tail -n1 只取最后一行“总计”行。
按扩展名分组统计前 5 大类型
适用于快速掌握磁盘占用主力类型:
find . -type f -name "*.*" -printf "%f\0" | awk -v RS='\0' '{split($0,a,"."); ext=a[length(a)]; if(ext!="") print ext}' | sort | uniq -c | sort -nr | head -5 | awk '{print $2 ": " $1 " files"}'- 再对每个高频扩展名单独统计大小,例如:
du -ch $(find . -type f -name "*.log") 2>/dev/null | tail -n1
注意:该方法适合中等规模目录;若文件极多,建议加 -maxdepth 2 限制查找深度,避免遍历过深。
生成带大小的类型分布报告(推荐)
兼顾可读性与实用性,输出类似:log: 2.4G tar.gz: 860M cache: 512M
find . -type f -printf "%f\t%k\n" | awk -F'[.\t]' '{ext=$NF; if(ext ~ /^[a-zA-Z0-9]+$/) sum[ext] += $2} END {for (e in sum) printf "%s: %.1fM\n", e, sum[e]/1024 | "sort -k2 -hr"}'
说明:%k 输出以 KB 为单位的实际磁盘块大小;$NF 提取最后一个点后的扩展名;sort -k2 -hr 按第二列(大小)逆序排,更直观。
排除干扰、聚焦业务文件
跳过日志、缓存、临时文件等非核心数据,让统计更反映真实业务体量:
find . -type f \( ! -name "*.log" ! -name "*.tmp" ! -name "cache*" ! -name "*.swp" \) -printf "%f\0" | xargs -0 file | grep -i "text\|json\|yaml\|xml" | cut -d: -f1 | xargs -r du -ch 2>/dev/null | tail -n1
这条命令先过滤掉常见临时/日志后缀,再用 file 判断真实内容类型,只统计文本类业务文件(如配置、数据、源码),最后汇总大小。











