Linux查看文件大小,du和df命令区别

前言

服务器磁盘满了,不知道哪个目录占的空间最大?du 和 df 是两个最常用的查看磁盘空间的命令,但很多人搞不清它们的区别。本文一次讲清楚。

du 和 df 的区别

du(Disk Usage)

看的是文件和目录占用的磁盘空间。

比如某个目录下有多少文件,总共占多少空间。

df(Disk Free)

看的是磁盘分区的整体使用情况。

比如整个硬盘总共有多大,用了多少,还剩多少。

一句话总结

  • du:看文件/目录占了多少
  • df:看磁盘分区总共多大、剩多少

df 命令

查看整体磁盘使用情况

df -h

-h 是 human-readable 的意思,输出成 K、M、G 的易读格式。

输出类似:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   30G   18G  63% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sdb1       100G   50G   45G  53% /data

只看某个分区

df -h /

只看根分区的使用情况。

显示文件系统类型

df -Th

多了一列 Type,显示是 ext4、xfs 还是其他类型。

du 命令

查看某个目录占多大空间

du -sh 目录路径

比如看 /var 目录:

du -sh /var

-s 是 summary,只显示总计;-h 是易读格式。

输出类似:

5.2G    /var

查看当前目录下每个子目录的大小

du -sh *

输出当前目录下每个子目录占多大空间。

按大小排序

du -sh * | sort -hr

sort -hr 是按数字从大到小排,这样就能一眼看到哪个子目录最大。

找当前目录下最大的10个文件

du -ah . | sort -hr | head -10

-a 是包括文件,不只是目录。

只看一层深度

du -h --max-depth=1 /var

只看 /var 下第一层的子目录大小,不往下钻。

常见场景

场景1:磁盘满了,找大文件

# 先看哪个分区满了
df -h

# 然后去那个分区找大目录
cd /
du -sh * | sort -hr | head -10

# 找到大目录后继续往下钻
cd /var
du -sh * | sort -hr | head -10

一步步找到占空间最大的文件,然后删掉。

场景2:看日志占了多少

du -sh /var/log

场景3:看网站占了多少

du -sh /var/www/html

常见坑

坑1:du 和 df 显示的已用空间不一样

明明删了大文件,但 df 显示还是满的。

原因: 文件被进程占用着,删了之后空间没真正释放。

解决: 找到占用这个文件的进程,重启或者杀掉:

lsof | grep deleted

找到 PID 后重启对应的服务。

坑2:du 命令跑了半天还在跑

du 一个大目录,半天没反应。

原因: 目录太大,文件太多。

解决: 加 --max-depth=1 限制深度,或者先确认一下目录有多大再决定要不要跑。

坑3:df 显示已用空间和 du 对不上

df 显示用了 80G,但 du 加起来才 50G。

原因: 可能有隐藏文件、挂载点下面的文件,或者有进程占用着已删除的文件。

解决: 检查:

# 看有没有挂载点
mount

# 看有没有已删除但还被占用的文件
lsof | grep deleted

坑4:du 显示的大小和 ls 不一样

ls 显示文件是 10M,du 显示是 11M。

原因: du 看的是磁盘块占用,文件系统按块分配空间,实际占用会比文件大小略大一点。

解决: 正常现象,不用纠结。

总结

命令 作用
df -h 看磁盘分区整体使用情况
du -sh 目录 看某个目录占多大空间
du -sh * | sort -hr 看当前目录下每个子目录大小并排序
du -h --max-depth=1 目录 只看一层深度
lsof | grep deleted 看已删除但被进程占用的文件

日常运维记住:df 看分区,du 看目录。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:46