先用find统计各目录空文件数量并排序取前20,再人工验证是否异常:查文件名类型、修改时间集中度及目录是否被程序写入;脚本check-empty-heavy.sh可简化扫描,加-xdev防跨分区误扫。

直接查“空文件数量多的目录”没有现成命令,但可以分两步定位:先找出含大量空文件的目录路径,再确认该目录是否真有异常堆积。
先统计每个目录下空文件个数
用 find 配合 awk 统计:
-
基础命令:
find /path -type f -size 0 | awk -F'/' '{dir=$1; for(i=2;i<NF;i++) dir=dir"/"$i; print dir}' | sort | uniq -c | sort -nr | head -20 - 说明:-type f -size 0 找所有 0 字节普通文件;-F'/' 按斜杠切分路径;循环拼出上级目录;uniq -c 统计重复次数;sort -nr 从高到低排序;head -20 取前 20 名
- 若想排除临时目录干扰,可加
-not -path "/tmp/*" -not -path "/var/tmp/*"
重点关注业务日志和缓存类路径
空文件常集中在以下几类目录,建议优先扫描:
-
日志目录:如
/var/log/app/、/opt/myapp/logs/,日志轮转失败后易残留大量 0 字节 .log 文件 -
上传或缓存中间目录:如
/data/upload/tmp/、/cache/.staging/,程序异常退出时可能留下空占位文件 -
容器挂载点内:检查
/var/lib/docker/volumes/下的匿名卷子目录,尤其注意名称含empty或tmp的目录
验证是否真属异常,避免误判
统计结果只是线索,需人工判断是否合理:
- 查看某高统计目录下的空文件名:
find /path/to/dir -type f -size 0 -ls | head -10,看是否全是.lock、.tmp、.part等临时标记文件 - 检查这些空文件的修改时间:
find /path/to/dir -type f -size 0 -printf '%T@ %p\n' | sort -n | tail -5,若集中在某次部署或故障时段,大概率是异常残留 - 确认父目录是否被程序持续写入:
lsof +D /path/to/dir 2>/dev/null | grep -q 'w' && echo "正在被写入" || echo "静默状态"
辅助快速筛查的简化脚本
保存为 check-empty-heavy.sh,运行时指定起始路径:
#!/bin/bash PATH=${1:-.} echo "扫描 $PATH 下空文件密集目录(Top 10):" find "$PATH" -xdev -type f -size 0 2>/dev/null | awk -F'/' '{d=""; for(i=1;i<NF;i++) d=d"/"$i; if(d!="/") print d}' | sort | uniq -c | sort -nr | head -10- 加
-xdev防止跨分区误扫(如跳进 /proc、/sys 或容器 overlayfs) - 输出示例:
127 /var/log/nginx 89 /opt/app/cache—— 表示这两个目录分别有 127 和 89 个空文件


















