<p>必须用 root 权限执行 du -sh --one-file-system /home/* 2>/dev/null | sort -hr,并结合 /etc/passwd 过滤 UID≥1000 且 shell 为 bash/zsh 的真实用户,避免权限错误、挂载点重复统计及空目录干扰。</p>

普通用户执行 du -sh /home/* 会大量报错
直接运行 du -sh /home/* 时,非 root 用户会遇到一堆 Permission denied,因为 /home 下其他用户的目录默认禁止读取。输出里夹杂大量错误行,sort -hr 会把错误当数据排,结果不可信。必须用 root 权限跑,否则统计不全。
du -sh /home/* 看似快,但容易误算挂载点和软链接
如果某用户把 ~/data 软链接到了 /mnt/bigdisk,而 /mnt/bigdisk 是单独挂载的文件系统,du 默认会顺着链接进去统计,导致同一块磁盘被重复计入多个用户名下。正确做法是加 --one-file-system 参数限制只统计本文件系统内的内容。
-
sudo du -sh --one-file-system /home/* 2>/dev/null | sort -hr是最简可用方案 - 不加
--max-depth=1是对的 ——/home/*展开后本身就是一级路径,不需要额外限制 -
2>/dev/null必须保留,否则权限错误会污染排序结果
要排除系统账户,得从 /etc/passwd 过滤真实用户
/home 目录下可能有 postgres、git 等服务账户,它们不是登录用户,不该出现在报表里。关键判断依据是 UID 和 shell:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- UID ≥ 1000:多数发行版(Ubuntu/Debian/CentOS)将普通用户起始 UID 设为 1000
- shell 匹配
/bin/bash或/bin/zsh:排除/usr/sbin/nologin、/bin/false等禁用 shell - 家目录存在且是目录:
[ -d "$homedir" ]防止因目录被删或迁移导致空路径传给du
完整命令示例:
awk -F: '$3 >= 1000 && $7 ~ /bash|zsh/ {print $1, $6}' /etc/passwd | \
while read user homedir; do \
size=$(du -sh --one-file-system "$homedir" 2>/dev/null | cut -f1); \
[ -n "$size" ] && printf "%-12s %s\n" "$user" "$size"; \
done | sort -k2hr输出里带路径不如直接显示用户名
原始 du 输出是 4.2G /home/alice,运维查起来还得自己截取用户名。用 awk 或 printf 提前提取 $1(用户名)更直观。注意 sort -k2hr 中的 -k2 表示按第二列(大小)排序,-h 支持 K/M/G 单位识别,-r 是逆序 —— 否则最大的反而排在最后。
真正容易被忽略的是:某些用户家目录为空或权限异常时,$size 为空字符串,不加 [ -n "$size" ] 判断就会输出 alice (后面没大小),这种脏数据混进排序会破坏可读性。

















