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 数字对不上

常见三种原因:

  1. 已删除文件仍被进程占用:文件删掉了但进程没释放句柄,du 不再统计,df 仍计入已用。用 lsof | grep deleted 找到占用进程,重启或截断对应文件即可释放。
  2. 硬链接重复统计口径:du 按目录累加,硬链接在不同目录可能被重复计数;df 看块设备分配更准。
  3. 隐藏在挂载点下的旧文件:目录里先写了数据,后在该路径挂载新盘,旧文件被遮盖,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

六、常见坑

  1. 只 du 不 df:看完目录不大,却忽略分区已 100%;
  2. du -sh / 统计到其他挂载点:加 -x 限定当前文件系统;
  3. 误删正在写入的大日志:空间不释放,应先重启对应服务或用 > 截断;
  4. 只看磁盘空间忽略 inode:小文件过多时空间有剩但创建文件失败,用 df -i 排查;
  5. 权限不足漏统计:普通用户 du 部分目录读不到,排查时用 root。

总结

df -h 看分区用量和剩余,du -sh --max-depth=1 目录 逐层定位大目录;两者数字不一致时优先怀疑"已删除但被进程占用"的文件,用 lsof | grep deleted 核对。排查顺序:先 df 定位分区,再 du 找目录,最后 find 找具体大文件。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-22 07:33