Linux查看文件大小,du和df命令区别
前言
排查磁盘满时最容易混淆 du 和 df:一个统计文件实际占用,一个统计分区已用空间,二者数字常常对不上。搞清楚各自口径、配合使用,才能准确找到占空间的目录和被已删除但仍被进程占用的空间。本篇讲清两者区别、常用参数和排查组合拳。
一、df:看分区(文件系统)整体用量
df 读取文件系统超级块,统计每个分区总容量、已用、可用、挂载点,回答的是"这块盘还剩多少"。
# 人类可读格式(K/M/G),显示文件系统类型
df -hT
# 只看某个挂载点
df -h /var
# 列出 inode 使用情况(空间没满但报 No space 时排查)
df -i
参数:-h 人类可读,-T 显示类型,-i 查看 inode,-x tmpfs 排除内存临时文件系统。
二、du:统计目录/文件实际占用
du 遍历目录树累加每个文件大小,回答的是"哪个目录最占地方"。
# 查看当前目录大小,人类可读
du -sh .
# 查看 /var 下一级子目录大小并排序(从大到小)
du -h --max-depth=1 /var | sort -rh | head -20
# 查看单个文件大小
du -h /var/log/messages
# 统计当前目录下各子目录,只显示总计
du -sh /var/*
参数:-s 只显示汇总,-h 人类可读,--max-depth=N 限定统计层级,-x 不统计其他挂载点。
三、两者核心区别
| 对比项 | df | du |
|---|---|---|
| 统计对象 | 文件系统分区整体 | 目录/文件实际大小 |
| 数据来源 | 超级块分配/使用记录 | 遍历文件累加 |
| 回答问题 | 盘还剩多少 | 哪个目录占空间 |
| 典型用途 | 判断是否磁盘满、inode 耗尽 | 定位大目录、大文件 |
四、为什么 du 和 df 数字对不上
常见三种原因:
- 已删除文件仍被进程占用:文件删掉了但进程没释放句柄,
du不再统计,df仍计入已用。用lsof | grep deleted找到占用进程,重启或截断对应文件即可释放。 - 硬链接重复统计口径:du 按目录累加,硬链接在不同目录可能被重复计数;df 看块设备分配更准。
- 隐藏在挂载点下的旧文件:目录里先写了数据,后在该路径挂载新盘,旧文件被遮盖,du 看不到,df 上一层分区仍占用。
五、磁盘满排查标准流程
# 1. 先用 df 确认哪个分区满了、inode 是否耗尽
df -h
df -i
# 2. 进入对应分区,逐层 du 找大目录
du -h --max-depth=1 /var | sort -rh | head
# 3. 找大于 500M 的文件
find /var -type f -size +500M -exec ls -lh {} \;
# 4. 检查被删除但仍占用空间的文件
lsof | grep deleted
定位到日志、缓存、旧备份等大文件后,优先归档或压缩,不要直接 rm 正在被写入的日志,应截断:
# 清空正在写入的日志而不释放句柄冲突
> /var/log/nginx/access.log
六、常见坑
- 只 du 不 df:看完目录不大,却忽略分区已 100%;
du -sh /统计到其他挂载点:加-x限定当前文件系统;- 误删正在写入的大日志:空间不释放,应先重启对应服务或用
>截断; - 只看磁盘空间忽略 inode:小文件过多时空间有剩但创建文件失败,用
df -i排查; - 权限不足漏统计:普通用户 du 部分目录读不到,排查时用 root。
总结
df -h 看分区用量和剩余,du -sh --max-depth=1 目录 逐层定位大目录;两者数字不一致时优先怀疑"已删除但被进程占用"的文件,用 lsof | grep deleted 核对。排查顺序:先 df 定位分区,再 du 找目录,最后 find 找具体大文件。
遇到问题加QQ23979811 协助处理