在Linux系统运维和日常开发中,准确掌握某个目录实际占用了多少磁盘空间,是排查存储异常、规划容量以及清理冗余文件的基础能力。与单纯看文件系统整体使用率的df命令不同,统计目录层级占用需要借助du这类遍历文件元数据的工具。不同参数组合会带来截然不同的统计视角,理解其底层逻辑才能避免被缓存文件或挂载点干扰。

du命令的基本工作原理与基础用法
du是disk usage的缩写,其核心逻辑是递归进入指定目录,对每个文件和子目录调用stat类系统调用获取所占用的磁盘块数,再按块大小累加。需要注意的是,Linux文件系统分配空间的最小单位是块(常见为4KiB),因此一个只写了一个字符的文件,在磁盘上也会占用一整块空间。这就解释了为什么du显示的大小往往大于文件内容字节数总和。
最基础的用法是直接运行 du 目录路径,它会输出该目录下所有子目录的累计空间,最后一行是当前目录的总计。但这种原始输出以磁盘块数为单位,可读性极差。加上 -h 参数后可自动转换为K、M、G等人类易读单位。例如 du -h /var/log 能直观看到每个日志子目录占用了多少兆空间。
若只想看目标目录自身的总大小而不展开子目录,应使用 -s(summary)参数。组合 du -sh /home 便是运维中最常用的查看家目录总占用的写法。此时du不会输出中间层级,只给一个汇总值,非常适合写监控脚本时快速取值。
# 查看/opt目录总占用,人类可读 du -sh /opt # 查看/etc下各子目录占用,人类可读 du -h /etc | sort -h # 以字节为单位显示某目录总计 du -sb /tmp
排除无关目录与精准控制统计范围
实际服务器上,某些目录如/proc、/sys是虚拟文件系统,或者某些挂载点存放了不希望被计入的外部存储,直接du会拖慢统计甚至得出无意义数据。这时 --exclude 参数非常关键。它可以按路径模式跳过指定目录,比如排除所有名为node_modules的文件夹,能极大加速前端项目磁盘分析。
对于需要跨文件系统的场景,-x 参数限制du只在本文件系统内统计,自动忽略挂载到其他磁盘的分区。这在分析根分区爆满原因时尤为重要,否则du会把/data独立盘的内容也算进根目录报告里。此外,--max-depth 能控制递归深度,例如 --max-depth=1 只统计直接子目录,避免输出被深层结构淹没。
下面示例展示如何综合使用这些参数:在网站根目录中仅看一级子目录占用,排除缓存与挂载盘,并输出可读结果。这种写法在排查云主机空间异常时,比图形化面板更灵活,也更容易写成定时巡检任务。
# 仅统计/var一级目录,排除/logs挂载点,人类可读 du -hx --max-depth=1 --exclude=/var/logs /var # 排除所有node_modules和.git目录 du -sh --exclude=node_modules --exclude=.git /srv/app
结合排序与管道快速定位空间大户
当目录结构复杂时,单纯罗列占用并无助于决策,必须排序突出顶部消耗者。由于du的 -h 输出带单位,普通sort按字母排会乱序,因此需用 sort -h 让其识别人类可读数字。将 du 与 sort 通过管道连接,再取头几行,就能立刻找到最占空间的子目录。
进一步可配合 head 限制输出条数,形成 du -h --max-depth=1 / | sort -h | tail -n 10 这类经典组合。注意这里用tail取最大项是因为sort -h默认升序,末尾才是最大的。若想降序可加 -r。在自动化报告里,还可以用 awk 抽取数值列做阈值报警,比人工翻日志高效得多。
另一个易忽略的点是稀疏文件(sparse file)与硬链接。du默认统计块占用,稀疏文件逻辑大小大但实占小;而硬链接因共享inode,du默认只计一次,这与某些备份工具的视角不同。理解这些差异,才能在看到du与ls大小不符时做出正确判断,而不是盲目删除文件。
# 找出根下最占空间的5个一级目录
du -hx --max-depth=1 / | sort -h | tail -n 5
# 将结果写入报告并提取超过1G的条目
du -h --max-depth=1 /data | awk '$1 ~ /G/ && $1+0 > 1 {print}'
通过上述多维度参数与管道协作,Linux下查看目录占用空间不再是模糊猜测,而是一套可复用、可脚本化的诊断流程。无论是临时清盘还是长期监控,掌握du的精细用法都能显著降低运维成本。
linuxdu_commanddisk_usage修改时间:2026-08-14 23:15:29