在Linux系统管理中,du命令是查看磁盘使用情况的常用工具。不过,很多用户都遇到过这样的困惑:只想快速了解一个目录下各个一级子目录的大小,结果执行du -sh /var后,终端瞬间被成百上千行递归结果刷屏,难以找到重点。 此时,--max-depth参数就能发挥作用。它的核心作用很简单:限制递归的
Linux du查看目录深度限制级数
时间:2026-07-07
浏览:132
文章目录
在Linux系统管理中,du命令是查看磁盘使用情况的常用工具。不过,很多用户都遇到过这样的困惑:只想快速了解一个目录下各个一级子目录的大小,结果执行du -sh /var后,终端瞬间被成百上千行递归结果刷屏,难以找到重点。

此时,--max-depth参数就能发挥作用。它的核心作用很简单:限制递归的深度,让用户只看想查看的层级。
du --max-depth=1:只显示一级子目录大小
当执行du -sh --max-depth=1 /var时,效果十分明显。命令只会统计/var目录下每个直接子项(例如/var/log、/var/cache)的总大小,而不会进入像/var/log/journal这样的二级或更深路径。输出界面瞬间变得清晰。
需要注意:参数必须写成--max-depth=1(带等号)。如果漏掉等号写成--max-depth 1,在大多数GNU版本的du上会直接报错du: unrecognized option '--max-depth 1'。
以下是几个实用的组合命令:
du -sh --max-depth=1 /var:以人类可读格式(K/M/G)清晰列出每个一级子目录的总大小。du -h --max-depth=1 /var | sort -hr:配合排序,一眼就能看出哪个目录占用空间最大,排查问题效率更高。
此外,如果设置深度为0(--max-depth=0),效果相当于只显示目标目录自身的总大小,这与直接使用du -s(汇总模式)的结果一致。
一个关键陷阱:--max-depth 与 -s 的互斥关系
这是最容易被忽视的地方。du -s参数的本意是“汇总”(summarize),它会忽略所有中间层级,只给出最终的总数。因此,当已经使用-s时,再附加--max-depth指定深度是没有意义的,后者会被静默忽略。
举例说明:du -sh --max-depth=3 /home 与 du -sh /home 的输出完全一样,都是/home目录下所有内容的总和。因为-s已经要求“只要总数”,--max-depth=3关于“展示到第三层”的指令自然失效。
牢记以下原则:
- 想分层查看结构:使用
du -h --max-depth=2 /etc(会显示/etc及其下一级、下两级目录的大小)。 - 只想要汇总总数:直接
du -sh /etc,无需添加--max-depth。
虽然混用-s和--max-depth不会报错,但后者实际上不起作用,了解这一点能避免无效调试。
跨平台注意:macOS 和 BusyBox 不支持 --max-depth
如果使用macOS或嵌入式设备中常见的BusyBox环境,会发现--max-depth参数并不存在。运行命令会直接提示du: illegal option -- -,因为这些系统自带的du源于BSD,没有GNU扩展参数。
此时,可选方案是借助find命令来模拟:
find /var -maxdepth 2 -mindepth 1 -type d -exec du -sh {} + | sort -hr
该命令的含义是:从/var开始,只找出深度为1到2的目录(即/var/xxx和/var/xxx/yyy),然后对每个找到的目录执行du -sh,最后统一排序。虽然功能上实现了--max-depth=2的效果,但逻辑更复杂,且因多次调用du,性能会稍逊一些。
平台差异总结如下:
- GNU
du(主流Linux发行版):直接用--max-depth,简洁高效。 - macOS:必须使用
find + du的组合,注意find的参数是小写-maxdepth。 - 编写跨平台脚本时:稳妥起见,可以先检测
du --version输出是否包含“GNU coreutils”字样。
进阶技巧:排序过滤时,小心隐藏目录
du --max-depth=1默认会统计以点号(.)开头的隐藏目录(例如.cache、.config)。但在使用grep过滤结果时,可能会遇到意料之外的问题。
例如,想排除所有隐藏项,可能尝试:du -sh --max-depth=1 ~ | grep -v "^\.\"。该命令的本意是过滤掉行首是点号的行。但du的典型输出格式是“大小 路径”,例如1.2G /home/user/.cache。整行开头是“1.2G”,并非点号,所以grep -v "^\.\"根本匹配不到,无法过滤。相反的,如果当前目录名本身就叫.tmp,这种过滤方式反而可能误删。
更安全的做法是使用awk精确匹配路径字段:
- 安全过滤隐藏项:
du -sh --max-depth=1 ~ | awk '$2 !~ /^\./'(匹配第二个字段不以点开头的行) - 只看隐藏项:
du -sh --max-depth=1 ~ | awk '$2 ~ /^\./'
推荐使用awk而非cut,因为du输出的大小和路径之间的空格数量不固定,awk默认按空白字符分割字段,处理更稳健。
总的来说,--max-depth参数本身并不复杂,真正的挑战在于理清它与-s的“互斥”关系,以及不同系统环境下的兼容性写法。在编写部署脚本或自动化工具时,切勿默认所有环境都支持GNU扩展,提前做好平台检测和备选方案,才是专业的表现。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。