登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 会把它排除。

Linux du 起始目录、同一文件系统和挂载文件系统之间的静态边界说明图
图1:说明图。/srv 下的 data 被标成另一文件系统时,du -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 可以同时使用,但两者的风险控制点不同:前者改变名称集合,后者改变可遍历的文件系统范围。

du 的文件系统边界、名称排除、显示深度和总计选项关系图
图2:结构图。-x、--exclude、-d 和 -s 解决的是不同统计口径;连线表示适用关系,不表示执行时序。

识别 -x 的边界与替代需求

下面几种需求看起来都像“少统计一点”,实际控制对象并不一样:

真实目标选项控制对象注意点
不跨到别的文件系统-x文件系统边界不是按挂载点名称排除
忽略某些名称--exclude=PATTERNshell 名称模式不是正则表达式
只看固定层级-d N显示深度不改变递归边界
只输出总计-s输出粒度不等于只统计同一文件系统

尤其要注意 -d 的误导性:它只决定打印多少层,不代表更深层目录没有被考虑。想限制“能不能进入另一个文件系统”,仍然要显式写 -x。

建立一次可复查的统计清单

为了避免不同人用不同口径复查,我会把下面四项和命令一起记录:

  1. 起始路径:例如 /srv,不要只记录“数据目录”。
  2. 边界参数:是否使用 -x 或 --one-file-system。
  3. 输出范围:是否使用 --max-depth、-s 和 -h。
  4. 排除规则:若有 --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 保留分项。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>