linux du 命令

du (Disk Usage) 是 Linux 系统中用于统计文件或目录所占磁盘空间大小的命令。

df(查看分区/文件系统 的整体使用情况)不同,du 的核心作用是深入目录内部 ,帮你找出具体是哪个文件夹或文件占用了大量空间。


1. 基本语法

复制代码
du [选项] [文件或目录]
  • 如果不加参数,默认显示当前目录下所有子目录的大小(递归显示)。
  • 如果指定了目录,则显示该目录及其子目录的大小。
  • 如果指定了文件,则显示该文件的大小。

2. 常用选项 (Options) ------ 必记组合

选项 全称 说明 示例
-h --human-readable 人类可读 。以 K, M, G, T 为单位 (最常用)。 du -h
-s --summarize 仅显示总计。不列出每个子目录,只显示指定目标的总和。 du -sh /var
-a --all 显示所有文件的大小,而不仅仅是目录。 du -ah
-c --total 在最后增加一行总计 (Combined total)。 du -ch
-d N (或 --max-depth=N) --max-depth 限制递归深度 。只统计到第 N 层子目录。排查大目录神器 du -h -d 1
--exclude 排除特定的文件或目录 (支持通配符)。 du -h --exclude="*.log"
-x --one-file-system 跳过其他文件系统。只统计当前所在分区,不跨越挂载点 (如 NFS, tmpfs)。 du -xh
-t --threshold 只显示大于指定大小的条目。 du -h -t 100M

3. 实战场景与经典命令

场景 A:快速查看当前目录下各一级子目录的大小 (最常用)

这是运维排查"磁盘满了"时的第一步操作。

复制代码
du -h -d 1
# 或者
du -h --max-depth=1
  • 含义 :以人类可读格式,只显示当前目录下第一层子目录的大小,不深入显示更深层的细节。

  • 输出示例 :text

    复制代码
    14.0K    ./bin
    21.2G    ./var
    3500M    ./home
    42.0G    .

    一眼看出 ./var 占了 1.2G,是主要嫌疑对象。

场景 B:查看特定目录的总大小

想知道 /var/log 整个文件夹占了多少空间,不想看里面的细节:

复制代码
du -sh /var/log
  • -s: Summarize (总计)
  • -h: Human-readable (人类可读)
  • 输出 : 1.2G /var/log
场景 C:找出当前目录下最大的前 10 个文件/目录

结合 sorthead 命令,直接定位"罪魁祸首"。

复制代码
du -ah | sort -rh | head -n 10
  • du -ah: 列出所有文件和目录的大小。
  • sort -rh: 按人类可读的数字大小进行反向排序 (Reverse, Human),即从大到小。
  • head -n 10: 只取前 10 行。
场景 D:排除不需要统计的目录

比如你想统计项目代码大小,但不想算上巨大的 node_modules.git 目录:

复制代码
du -h -d 1 --exclude="node_modules" --exclude=".git"
  • 支持多次使用 --exclude
  • 也可以使用通配符:--exclude="*.log"
场景 E:只统计当前分区 (防止遍历挂载的网络存储)

如果你在一个挂载了巨大网络存储 (NFS) 的目录下运行 du,可能会跑很久甚至卡死。加上 -x 可以限制只在当前物理分区统计:

复制代码
1du -xh -d 1
场景 F:查找大于 500M 的大文件
复制代码
du -ah -t 500M
  • -t 500M: Threshold (阈值),只显示大于 500MB 的条目。

4. du vs df (核心区别回顾)

很多新手会困惑:为什么 du 统计的总和 小于 df 显示的已用空间?

特性 du (Disk Usage) df (Disk Free)
统计对象 文件 (遍历目录树累加文件大小) 文件系统块 (读取超级块元数据)
速度 较慢 (需要遍历文件) 极快 (直接读取元数据)
差异原因 不统计 : 1. 已被删除但被进程占用的文件 ("幽灵文件") 2. 隐藏的系统保留空间 (reserved blocks) 3. 某些特殊文件系统开销 包含 : 1. 上述所有空间占用
典型用途 "哪个文件夹占用了我的空间?" "我的硬盘还剩多少空间?"

💡 故障排查技巧

如果 df 显示磁盘已满 (100%),但 du -sh /* 加起来只有 50%:

  1. 大概率是有文件被删除了,但进程(如 Java, Nginx, MySQL)还开着它。
  2. 执行 lsof | grep deleted 查找这些文件。
  3. 重启对应进程或清空文件内容 (> /proc/PID/fd/FD) 释放空间。

5. 输出字段详解

执行 du -h 时:

复制代码
14.0K    ./config
21.5M    ./logs/access.log
32.3G    ./data
  • 第一列:大小 (带单位)。
  • 第二列:文件或目录路径。
  • 注意:对于目录,显示的是该目录下所有内容的累计大小。

6. 总结与推荐命令

  • 看当前目录谁最大 :bash

    复制代码
    du -h -d 1 | sort -rh | head -n 10
  • 看某个文件夹总大小 :bash

    bash 复制代码
    du -sh /path/to/dir
  • 查找大于 1G 的所有文件 :bash

    bash 复制代码
    du -ah -t 1G
  • 统计当前分区(忽略挂载点) :bash

    复制代码
    1du -xh -d 1

du 是清理磁盘空间时不可或缺的工具,配合 sort 使用能极大提高效率。

相关推荐
戴为沐15 小时前
Linux内存扩容指南
linux
zylyehuo1 天前
Linux 彻底且安全地删除文件
linux
用户805533698032 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297912 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者3 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo3 天前
Linux系统中网线与USB网络共享冲突
linux
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜4 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https