Linux du 怎样排除挂载点统计目录空间
来源:17golang原创
时间:2026-10-27 00:32:25 318浏览 收藏
我在排查目录空间时最容易踩的坑,不是 du 不会用,而是统计口径被挂载目录悄悄改变了:从父目录开始递归时,结果可能把另一个文件系统里的内容也算进来。要按文件系统边界停止遍历,直接使用 du -x,长选项写法是 du --one-file-system。
官方地址:https://www.gnu.org/software/coreutils/du
常用起点是du -xh --max-depth=1 /srv:-x只遍历与/srv相同文件系统的目录,-h让大小易读,--max-depth=1让结果停在第一层。若只要总计,再换成du -xsh /srv。
先明确 du 的统计边界
du 的默认任务是递归汇总文件或目录的设备使用量。这里的“排除挂载点”要先说清楚:-x 判断的是文件系统边界,等价于“不要进入不同文件系统的目录”,并不是按目录名字寻找所有 mountpoint。若一个挂载位置和起始目录仍落在同一个文件系统上,不能仅凭“它是挂载点”就保证 -x 会把它排除。

因此,先把需要保护的统计资产定义为“起始目录所在文件系统的空间”,再把跨文件系统内容视为会污染口径的路径。这样排查出来的数字才适合和同一主机上的文件系统容量、配额或历史记录比较。
用 du -x 限制文件系统范围
最小命令如下:
# 只统计 /srv 所在文件系统,不进入其他文件系统的目录 du -x /srv # 长选项写法与 -x 等价,适合写进运维说明 du --one-file-system /srv
GNU du 手册把 -x 定义为 --one-file-system,作用是跳过位于不同文件系统上的目录。命令返回的每一行仍然是目录空间统计,不会额外告诉你“哪些挂载点被跳过”;如果要留下可复查记录,应该把起始路径和完整参数一起保存。
人工查看时通常需要可读单位和一层汇总:
# 在 /srv 第一层查看同一文件系统内的目录空间 du -xh --max-depth=1 /srv # 只保留 /srv 的总计,避免子目录列表干扰判断 du -xsh /srv
-h 只改变显示单位,--max-depth=1 只限制输出深度,二者都不会替代 -x。我一般先看第一条,确认哪个一级目录占用明显,再用第二条记录一个不会被子目录列表分散注意力的总数。
叠加深度、总计与排除模式
当目标是“同一文件系统内,找出第一层的大户”,可以组合边界和深度:
# -x 负责文件系统边界,-d 负责显示层级,-h 负责单位 du -xhd 1 /var # 需要所有参数写全时,避免读者把数字误认为目录名 du --one-file-system --human-readable --max-depth=1 /var
如果目标只是排除名字匹配的文件或子目录,使用 --exclude,不要把它误写成 -x:
# 只排除名称匹配 cache 的条目;这是名称模式,不是挂载边界 du -xh --exclude='cache' --max-depth=1 /var # 排除所有以 .tmp 结尾的文件或目录 du -xh --exclude='*.tmp' /var
--exclude 使用 shell 模式而不是正则表达式,模式边界要按路径树实际名称来设计。它和 -x 可以同时使用,但两者的风险控制点不同:前者改变名称集合,后者改变可遍历的文件系统范围。

识别 -x 的边界与替代需求
下面几种需求看起来都像“少统计一点”,实际控制对象并不一样:
| 真实目标 | 选项 | 控制对象 | 注意点 |
|---|---|---|---|
| 不跨到别的文件系统 | -x | 文件系统边界 | 不是按挂载点名称排除 |
| 忽略某些名称 | --exclude=PATTERN | shell 名称模式 | 不是正则表达式 |
| 只看固定层级 | -d N | 显示深度 | 不改变递归边界 |
| 只输出总计 | -s | 输出粒度 | 不等于只统计同一文件系统 |
尤其要注意 -d 的误导性:它只决定打印多少层,不代表更深层目录没有被考虑。想限制“能不能进入另一个文件系统”,仍然要显式写 -x。
建立一次可复查的统计清单
为了避免不同人用不同口径复查,我会把下面四项和命令一起记录:
- 起始路径:例如
/srv,不要只记录“数据目录”。 - 边界参数:是否使用
-x或--one-file-system。 - 输出范围:是否使用
--max-depth、-s和-h。 - 排除规则:若有
--exclude,保存完整的 shell 模式。
如果结果需要用于容量告警或迁移前估算,还要单独说明它统计的是设备使用量还是表观大小。GNU du 默认汇总设备使用量;--apparent-size 是另一种口径,不能和“排除不同文件系统”混为一个开关。
常见问题
为什么 du -x 仍然看到了挂载目录名?
-x 约束的是遍历和统计的文件系统范围,不承诺从输出中删除父目录名。若挂载目录本身仍出现在列表里,重点看它是否被计入了另一个文件系统里的内容,而不是只看名称是否出现。
du -x 和 du --exclude 哪个更适合排除挂载点?
若问题是跨文件系统污染,优先使用 -x。--exclude 只按名称模式匹配,目录改名或路径层级变化就可能改变结果,不能替代文件系统边界控制。
--max-depth=1 能不能达到 du -x 的效果?
不能。--max-depth 限制显示层级,-x 限制不同文件系统的遍历边界;一个控制输出粒度,一个控制统计范围。
什么时候需要 du -s?
只需要给出一个目录总数,或要把结果交给脚本继续处理时,可以使用 du -xsh /path。如果还需要定位哪个一级目录占用空间,先用 --max-depth=1 保留分项。
-
106 收藏
-
411 收藏
-
209 收藏
-
312 收藏
-
441 收藏
-
215 收藏
-
219 收藏
-
184 收藏
-
261 收藏
-
284 收藏
-
478 收藏
-
422 收藏
-
392 收藏
-
272 收藏
-
285 收藏
-
252 收藏
-
432 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习