正确用法是 du -sh --max-depth=1 . | sort -hr:-s 确保每项单行总计,-h 输出人类可读单位,-r 倒序排列;sort -h 要求输入为“大小+空格+路径”格式,du -sh 恰好满足,而 du -h --max-depth=1 默认用制表符分隔,会导致排序错乱。

du --max-depth 和 sort -h 配合用不对?
直接写 du --max-depth=1 -h | sort -h 会报错或结果错乱,因为 sort -h 要求输入是“人类可读单位+空格+路径”的标准格式,而 du -h 默认输出是“大小+制表符+路径”,sort -h 无法正确识别字段分隔符。常见错误是排序失效、单位混杂(K/M/G 乱序)、甚至卡死。
正确做法是强制用空格分隔,并确保每行只有“大小 路径”两列:
-
du -sh --max-depth=1 . | sort -hr——-s确保每项只输出一行总计,-h输出带单位,-r倒序(大在前) - 如果路径含空格或特殊字符,加
-0配合xargs -0更安全,但日常排查不必要 - 别用
sort -n处理-h输出——它把1G当字符串排,10M会排在2G前面
想看“文件夹深度”本身,不是大小?
注意:du 不提供“深度值”作为输出字段;它只是限制统计时递归多少层。所谓“查看文件夹深度”,实际是指:列出各子目录的嵌套层级数(比如 ./a/b/c 深度为 3),这得靠 find + awk 或 bash 计算路径分隔符数量。
快速获取当前目录下所有子目录的深度并排序(升序):
find . -type d -mindepth 1 -maxdepth 5 | awk -F'/' '{print NF-1, $0}' | sort -n | head -10
说明:
-
-mindepth 1排除当前目录.本身 -
-maxdepth 5防止遍历过深拖慢速度(可按需调高) -
awk -F'/' '{print NF-1, $0}'把路径按/拆分,NF是字段数,减 1 得深度(./a→ 2 字段 → 深度 1) -
sort -n按第一列(深度)数值排序
为什么 du --max-depth=1 有时漏掉隐藏目录?
du --max-depth=1 * 这种写法会跳过以 . 开头的目录(如 .git、.config),因为 shell 的通配符 * 默认不匹配隐藏文件/目录。
要完整覆盖,必须显式包含点开头项:
- 用
du -sh --max-depth=1 .*/ *—— 但可能报错“cannot access './.git': Permission denied”,需加2>/dev/null - 更稳妥:用
find . -maxdepth 1 -type d ! -name '.' -exec du -sh {} \; 2>/dev/null | sort -hr - 注意
find的-maxdepth 1包含当前目录.,所以加! -name '.'排除它
排序后想看具体是哪个大文件夹?别只信 head -10
du -sh --max-depth=1 . | sort -hr | head -10 看起来快,但有个坑:当多个子目录大小完全相同时(比如都是 0 或都显示为 16K),sort -hr 不保证稳定顺序,不同执行结果可能不一致,容易漏掉真正可疑的目录。
建议加 -k1,1 强制按第一列(大小)主键排序,再用路径次序兜底:
du -sh --max-depth=1 . | sort -hr -k1,1 | head -10
另外,du 统计的是磁盘占用(含块对齐、硬链接等),不是逻辑大小;若需精确对比,加 --apparent-size 参数,但要注意它不反映真实磁盘压力。











