du --max-depth=1 用于仅统计目标目录下直接子项大小,不递归深入二级目录;必须用等号连接(--max-depth=1),-d1 或 -d1 等写法错误或不兼容。

用 du --max-depth=1 查一级目录占用,不是 du -D1
du -D1 是无效写法,-D 选项在 GNU du 中代表 --dereference-args(解析符号链接目标),后面跟数字 1 不会被识别,直接报错:du: invalid option -- 'D' 或类似提示。
真正控制层级的参数是 --max-depth=1(或简写为 -d 1,但后者非 POSIX 标准,部分老系统不支持)。它表示:只统计当前路径下「直接子项」的磁盘占用,不进入二级及更深目录。
常见误操作包括:
- 把
-d1连写(应为-d 1或--max-depth=1) - 在 root 下执行却忘了加
sudo,导致跳过权限不足的目录(如/root、/proc下部分子树) - 未加
-h,输出全是字节,难以快速判断大小关系
du -sh --max-depth=1 / 能看到所有一级业务目录吗?
不能直接看到“业务目录”——/ 下的一级子目录是系统标准路径(/bin、/etc、/home、/var 等),它们本身不是业务,但业务数据常落在其中:
-
/home:用户主目录,通常对应各业务账号(如/home/appuser) -
/var/www或/var/www/html:Web 服务根目录 -
/opt:第三方/自研业务软件安装位置 -
/data或/srv:很多团队约定存放业务数据 -
/usr/local:本地编译部署的服务
所以更实用的做法是:
- 先跑
sudo du -sh --max-depth=1 /,快速扫一遍哪些一级目录明显偏大(比如/var占 42G,/home占 86G) - 再针对性进入可疑目录,例如
sudo du -sh --max-depth=1 /var/* | sort -hr | head -n10,定位具体业务子路径 - 若业务集中在
/data,直接sudo du -sh --max-depth=1 /data/更高效
为什么 du -sh --max-depth=1 / 有时漏掉挂载点?
因为默认情况下 du 会跨文件系统遍历。如果 /mnt/backup 或 /data 是独立挂载的磁盘,du 仍会把它当普通子目录统计——这通常是你想要的。
但如果你只想看根文件系统本身(即不包含其他挂载点),必须加 -x 参数:
-
sudo du -shx --max-depth=1 /:只统计/所在分区的内容,跳过/mnt、/data等挂载点 - 不加
-x:统计所有可访问路径,含挂载点,结果更“全”,但也可能混入无关存储
注意:-x 对权限敏感。若挂载点目录本身不可读(如 dr-xr-xr-x 且非 root),即使加了 -x 也会被跳过——这时必须用 sudo。
排查业务目录时,怎么排除干扰项?
真实环境里,/var/log、/var/cache、/tmp 常年膨胀,但它们不属于业务逻辑。用 --exclude 过滤能更快聚焦:
sudo du -sh --max-depth=1 /var/ --exclude=log --exclude=cache --exclude=tmp- 支持通配:
--exclude='*.log',但注意 shell 会提前展开,建议单引号包裹 - 多个排除:重复写
--exclude,不能合并成--exclude=log,cache
另外,/proc、/sys、/dev 是虚拟文件系统,du 统计它们会卡住或返回 0 —— 实际使用中应主动避开,或依赖 find / -maxdepth 1 -type d ! -name 'proc' ! -name 'sys' ! -name 'dev' -exec du -sh {} \; 2>/dev/null 这类组合。
真正难的是区分「谁在用空间」。看到 /home 占大头后,别急着删,先用 sudo du -sh /home/<em> | sort -hr</em> 看用户级分布;再进具体用户目录,用 du -sh .[!.] * 把隐藏文件(如 .git、.cache)也纳入视野——这些细节不查,光看一级目录等于没查。











