Linux运维中统计指定目录下各子目录的文件数量与体积排行需分步:先用find统计一级子目录常规文件数,再用du统计其磁盘占用,最后通过bash循环+printf整合两指标并按体积(主)和文件数(次)排序。

Linux 运维中统计指定目录下各子目录的文件数量与总体积排行,核心是分两步走:先分别获取每个子目录的文件个数,再分别获取其磁盘占用体积,最后合并排序。关键不在于单条命令“一步到位”,而在于用对工具、控制范围、避免递归污染结果。
查每个子目录的文件数量
只统计一级子目录(不含隐藏目录)里的常规文件个数,推荐用 find 配合 -maxdepth:
- du -sh --max-depth=1 /path/to/dir 只看体积,不看文件数;要数文件,得换工具
- find /path/to/dir -maxdepth 1 -mindepth 1 -type d -exec bash -c 'echo "$(find "$1" -maxdepth 1 -type f | wc -l) $1"' _ {} \; | sort -nr —— 逐个进入每个一级子目录,统计其内部常规文件数,并按数量倒序排
- 更简洁写法:for d in /path/to/dir/*/; do [ -d "$d" ] && echo "$(find "$d" -maxdepth 1 -type f | wc -l) ${d%/}"; done | sort -nr
查每个子目录的磁盘占用体积
体积必须用 du,因为它统计真实块占用,不是 ls 显示的逻辑大小:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- du -sh --max-depth=1 /path/to/dir/*/ —— 直接列出所有一级子目录(含末尾 / 的路径)的磁盘用量,-h 易读,-s 汇总
- 若想排除某些干扰项(如 node_modules、.git),加 --exclude:du -sh --max-depth=1 --exclude="node_modules" --exclude=".git" /path/to/dir/*/
- 结果默认无序,加 | sort -hr 即可按体积从大到小排列
把数量和体积合并成一张排行表
Linux 没有内置“双指标排序”命令,但可用 bash 循环+printf 构建结构化输出,再统一排序:
- 执行:for d in /path/to/dir/*/; do [ -d "$d" ] && printf "%s\t%s\t%s\n" "$(du -sh "$d" 2>/dev/null | cut -f1)" "$(find "$d" -maxdepth 1 -type f 2>/dev/null | wc -l)" "${d%/}"; done | sort -k1,1hr -k2,2nr
- 说明:
– 第一列是 du 体积(-k1,1hr 按第一列人类可读格式逆序)
– 第二列是文件数(-k2,2nr 按第二列数字逆序)
– 第三列是目录名
– 用 tab 分隔,便于后续用 awk 或 Excel 处理 - 如只需体积主导排序,忽略文件数权重,直接用 du -sh --max-depth=1 /path/to/dir/*/ | sort -hr 更快更稳
注意事项与避坑点
实际运维中容易踩的几个坑:
- 权限问题:遇到 Permission denied,别盲目加 sudo——先确认是否真需扫描系统目录;若必须,把 sudo 加在 du 和 find 前,如 sudo find ...
- 符号链接处理:默认 find -type f 不跟随软链,du 也不展开;如需包含链接指向的目标,加 -L 参数,但要小心循环引用
- 小文件性能:子目录里文件极多时(如日志归档),find | wc -l 比 ls -1 | wc -l 更准也更快,尤其跨文件系统时
- 隐藏目录默认不计入:上面所有命令中的 */ 不匹配 .开头目录;如需包含,改用 /path/to/dir/{*,.*} 并过滤掉 . 和 ..

















