讲解

查磁盘有两个互补的命令:df(disk free)从文件系统的角度回答「每个分区还剩多少空间」,du(disk usage)从目录的角度回答「这个目录占了多少空间」。磁盘报警时的标准排查路径就是先用 df -h 定位满的是哪个分区,再用 du 逐层下钻找到占空间的元凶。

df -h 的 -h 让容量以 G/M 易读显示,重点看 Use% 和挂载点(Mounted on)。du 的常用形态:du -sh 目录 汇总一个总大小;du -h -d 1 目录 显示下一层每个子项的大小(-d 1 限制深度为 1 层;GNU 的等价写法是 --max-depth=1,-d 两边都支持)。配合排序找大目录:du -k -d 1 . | sort -rn | head——这里用 -k 输出纯数字的 KB 数,因为 sort -n 认不得 K/M/G 后缀。

一个经典的灵异事件:df 显示分区满了,du 却怎么也算不出那么多占用。最常见的原因是「已删除但仍被进程占用的文件」——比如日志文件被 rm 删掉了,但写它的程序还握着文件句柄,空间就不会释放。解决方法是重启那个进程(而不是重启机器),Linux 上可以用 lsof | grep deleted 找到这类文件。所以清理运行中程序的日志要用 > app.log 清空而不是 rm。

示例

# 各分区的容量与使用率(-h 易读单位)
df -h .

# 当前目录总大小
du -sh .
# 下一层每个子项的大小,按数值倒序
du -k -d 1 . | sort -rn

常见坑

  • df 满了 du 找不到:大概率是已删除但仍被进程打开的文件。重启占用进程释放空间,别上来就重启整机。
  • rm 运行中程序的日志:空间不释放,正确的清日志姿势是 > app.log 截断。
  • du 跨分区统计:du 默认会钻进挂载的其他分区,加 -x 限制在当前文件系统内,数字才对得上 df。
  • 对巨大目录直接 du -sh /:会扫全盘文件,跑很久。先 df 定位分区,再逐层 -d 1 下钻。

小结

df 看分区余量,du 看目录占用,-h 易读、-d 1 分层、sort -rn 找大户;删日志用截断不用 rm。下一节学习打包与压缩:tar 与 gzip。