du命令不支持直接排除目录,但可通过--exclude(GNU版)、find+du组合或grep过滤实现;推荐优先使用--exclude,兼容性场景用find -prune,grep仅作输出过滤。

du 命令本身不支持直接“排除目录”的语法,但可以通过配合 find、grep 或使用 --exclude(GNU 版本支持)实现目的。关键看你的系统是否使用 GNU coreutils,以及是否需要递归跳过某些子树。
方法一:使用 --exclude(推荐,GNU du 支持)
大多数现代 Linux 发行版(如 Ubuntu、CentOS 7+、Debian)自带的 du 是 GNU 版本,支持 --exclude 参数:
- 排除单个目录:
du -sh --exclude="node_modules" /path/to/project - 排除多个目录:可重复使用
--exclude,如du -sh --exclude="node_modules" --exclude=".git" --exclude="dist" /path/to/project - 支持通配符:
--exclude="*.log"可跳过所有日志文件(注意:匹配的是路径中的文件名部分,不是完整路径)
方法二:用 find + du 组合(兼容性最强)
当 du 不支持 --exclude(如某些精简系统或 BusyBox 环境),可用 find 先筛选路径,再交给 du 统计:
- 跳过指定目录(例如 .git 和 cache):
find /path/to/dir -type d \( -name ".git" -o -name "cache" \) -prune -o -type f -print0 | du -ch --files0-from=- - 说明:
-prune表示遇到匹配目录就跳过其整个子树;-o -type f -print0输出其余普通文件(用\0分隔防空格问题);--files0-from=-让 du 从标准输入读取文件列表
方法三:结合 grep 过滤(简单场景适用)
适合快速查看并人工排除,不改变统计逻辑,仅过滤输出结果:
du -sh /path/to/dir/* 2>/dev/null | grep -vE "(node_modules|\.git|venv)$"- 注意:这只是隐藏输出,du 本身仍遍历了所有子目录,效率低且不能跳过大目录的扫描,仅作展示过滤
注意事项与技巧
-
--exclude 匹配的是路径中“最后一段”名称(basename),不是绝对路径。例如
--exclude="log"会排除任何名为log的目录或文件,无论在哪层 - 想排除绝对路径(如
/var/log),需用 find 方式配合-path - 统计总大小时建议加
-c(显示总计),加-h(人类可读),避免用-s单独和--exclude混用导致子目录被误计——应确保--exclude作用于整个扫描过程 - 权限不足的目录会报错,可加
2>/dev/null屏蔽(但注意可能掩盖真实问题)











