<p>用du和find组合精准定位真实磁盘占用大文件:find /var/log -xdev -type f -print0 | du -h --files0-from=- | sort -hr | head -n 20,该方法规避路径空格问题、排除跨文件系统干扰,并准确反映稀疏文件与硬链接的实际块占用。</p>

直接用 du 和 find 组合,别信 ls -lS 或只扫当前层的命令——它根本看不到深层大文件,也分不清稀疏文件、硬链接和符号链接的真实占用。
用 du -ah + sort -hr 找真正吃空间的文件
du 统计的是实际磁盘块占用,比 find -size 更准(尤其对稀疏文件、压缩日志、Docker overlay 层)。但默认会把目录也混在结果里,容易误判。
- 必须加
-a:否则只列目录,不列文件 - 必须加
--files0-from=-配合find -print0:否则含空格或换行的路径会崩,xargs不安全 - 推荐写法:
find /var/log -xdev -type f -print0 | du -h --files0-from=- | sort -hr | head -n 20 - 别用
du -sh *:shell 展开通配符后参数超长,触发Argument list too long
用 find -size 快速筛出超限文件,但单位和边界要小心
find 不扫描内容,只读 inode 的 st_size,所以快。但它不反映真实磁盘占用(比如一个 1GB 的稀疏文件,du 可能只报几 KB)。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
-size +1G表示“严格大于 1GB”,不是 ≥;-size -1G是“严格小于” - 单位大小写敏感:
+500M合法,+500m会被忽略 - 务必加
-xdev:否则可能卡死在/proc、/sys或远程挂载点 - 加
2>/dev/null屏蔽权限错误,否则一堆Permission denied冲刷结果 - 示例:
find /home -xdev -type f -size +200M -ls 2>/dev/null(-ls比-exec ls -lh更安全)
查完发现 df 和 du 对不上?可能是已删未释放的文件
执行 df -h 显示用了 35G,但 du -sh / 总和只有 8G——差的那部分,大概率是被进程 hold 住的已删除文件。
- 运行
lsof +L1:列出所有 link count = 0 的打开文件(即已删但未释放) - 重点关注
deleted标记的行,看 size 列,常是几十 MB 到几个 GB 的日志 - 对应进程通常是
java、nginx、dockerd或rsyslogd - 释放方式不是再删一次,而是重启该进程,或向其发
SIGUSR1(如 nginx)触发日志 reopen
别漏掉 ext4 的 5% 预留空间和 inode 耗尽
有时 df -h 显示用了 95%,但 du 加总才 90%,多出来的就是 ext4 默认给 root 预留的 5%。这不算“丢失”,但会影响你对真实余量的判断。
- 查看预留比例:
tune2fs -l /dev/vda1 | grep "Reserved block count" - 调低到 1%:
tune2fs -m 1 /dev/vda1(需 root,且不建议在生产库上随意改) - 更隐蔽的问题是
Inodes耗尽:df -i查看,若Use%接近 100% 但Size还剩很多,说明创建不了新文件,哪怕空间充足 -
find /var/log -xdev -type f | cut -d/ -f1-4 | sort | uniq -c | sort -nr | head可快速定位生成大量小文件的目录

















