跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Linux如何统计目录中不同后缀文件的占用空间占比

用 find + du 配合 awk 可按后缀精确统计空间占比,核心是安全提取文件后缀并累加字节数,再计算百分比;ncdu 仅适合交互式验证,无法直接导出后缀占比。 用
find
+
du
按后缀分组统计空间占用 直接用
du
本身不支持按扩展名聚合,必须配合
find
筛选 +
awk
或
sort
归类。核心思路是:对每个文件单独跑
du -b
获取字节数,提取后缀(注意空后缀和隐藏文件),再累加求占比。 常见错误是用
ls *.ext | du -sh
—— 这会漏掉子目录中匹配的文件,且通配符在深层目录失效;还有人用
du --exclude
反向排除,逻辑绕、易出错。
find /path -type f -not -name ".*" -print0 | xargs -0 du -b
:先安全获取所有非隐藏普通文件(
-print0
防空格路径崩) 后缀提取要小心:
basename
后用
sed 's/.*\.//;t;d'
提取最后一个点后的部分,但得单独处理无点文件(如
Makefile
)和以点开头的(如
.gitignore
),建议统一归为
noext
或
hidden
最终用
awk '{ext[$2] += $1} END {for (e in ext) print ext[e], e}'
累加,再除以总数算百分比 一行命令快速出带百分比的汇总表 以下命令可直接运行(替换
/path
):
find /path -type f -print0 | \ xargs -0 du -b | \ awk -F/ '{file=$NF; sub(/^.*\./, "", file); if(file=="") file="noext"; print $1, file}' | \ awk '{size[$2]+=$1; total+=$1} END {for (e in size) printf "%6.2f%% %s\n", size[e]/total*100, e}' | \ sort -nr
说明:
sub(/^.*\./, "", file)
是正则提取后缀,比
cut -d. -f2-
更准(避免
a.b.c.js
被截成
b.c.js
);
sort -nr
按百分比倒序排,一眼看到大头。 注意:如果目录含大量小文件,
xargs
可能触发多次
du
调用,性能略低但结果准确;追求速度可用
du -b --files0-from=-
(GNU coreutils ≥8.25),但兼容性稍差。 Trae linux Trae Linux 官方版本现已全面上线,开发者可直接访问 Trae 官网(trae.cn 国内版或 trae.ai 国际版)获取专属安装包。该版本完美适配主流 Linux 发行版,提供 .deb(适配 Ubuntu/Debian)、.rpm(适配 RHEL/Fedora)以及通用 .tar.gz 格式,并全面支持 x64 与 ARM64 架构。 下载 用
ncdu
交互式查看但无法直接导出后缀占比
ncdu
是可视化磁盘分析利器,但它按目录树展开,不提供“按扩展名聚合”视图。有人尝试
ncdu -o /tmp/ncdu.json /path
导出 JSON 再解析,但字段里没有后缀信息,必须额外从路径字段里提取,反而比纯
find
方案更重。 所以别被界面迷惑——真要统计后缀占比,
ncdu
只适合辅助验证某类文件(比如确认
.log
是否集中在某个子目录),不能替代脚本化统计。 安装:
apt install ncdu
(Debian/Ubuntu)或
yum install ncdu
(RHEL/CentOS) 启动后按
Shift+D
可删掉大文件快速释放空间,但这和统计无关 它的优势在于实时交互、支持键盘导航,不适合批量分析或 CI 场景 隐藏文件、符号链接和硬链接的处理差异 默认
find -type f
不包含符号链接(除非加
-follow
),而硬链接会被重复计数(
du
对同一 inode 多次出现仍累加)。这会导致统计偏差: 若需包含软链指向的文件,加
-follow
,但注意可能跨文件系统或循环引用 若要排除硬链接重复,得先用
find -type f -printf "%i %p\n"
按 inode 去重,再喂给
du
,复杂度陡增,一般场景不推荐 隐藏文件(
.*
)是否纳入取决于需求:日志类统计常要包含
.log
,配置类可能忽略
.git
目录下的文件——建议显式控制,比如加
-not -path "./.git/*"
最易被忽略的是:不同文件系统挂载点(如
/home
单独挂载)下,
du
统计天然隔离,但你的脚本若没限定
-xdev
,可能跨分区把其他文件系统内容也扫进来,导致总数虚高。

相关文章