ls -lS 按文件大小降序列出当前目录所有条目(含目录),但大小单位为字节且目录显示元数据大小(通常4096);ls -lhS 虽可读性强,却因字符串排序导致跨单位错乱;真正可靠的是 du -sh * 2>/dev/null | sort -rh(排实际磁盘占用)或 find . -maxdepth 1 -type f -printf '%s %p\n' 2>/dev/null | sort -nr(仅普通文件数值排序)。

用 ls -lS 最直接,但默认不带单位、不处理目录混排
直接运行 ls -lS 就能按文件大小降序列出当前目录所有条目(含子目录),因为 -S 表示“按 size 排序”,-l 提供详细信息(含 size 字段)。但要注意:
- 输出的大小单位是字节(B),数字长且难读
- 目录也会被包含进来,而目录大小显示的是其元数据占用(通常 4096),不是实际内容大小
- 如果只想看普通文件,得额外过滤
加 -h 让大小可读,但排序逻辑会变脆弱
ls -lhS 看起来更友好——大小变成 12K、2.3M 这类格式。但问题来了:sort 不再是纯数值排序,而是字符串排序。
这意味着 10M 会排在 2M 前面(因为字符串比较时 "10M" ),结果错乱。所以 ls -lhS 的排序只是“看起来对”,实际不可靠,尤其当文件跨 KB/MB/GB 单位时。
真正安全的做法是:要么不用 -h(坚持 ls -lS),要么换用 du + sort -h 组合。
用 du -sh * + sort -rh 只排普通文件和子目录总大小
如果你关心的是“谁真正占空间”,而不是 inode 元数据大小,du 是更准确的选择。以下命令只作用于当前目录下的**非隐藏**条目:
du -sh * 2>/dev/null | sort -rh
说明:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
du -sh *:对每个匹配项(文件或目录)计算人类可读的总磁盘用量;*不匹配隐藏文件(.xxx) -
2>/dev/null:屏蔽权限不足导致的错误(如无法进入某个子目录) -
sort -rh:-h支持人类可读单位排序(1K ),-r倒序 → 最大在前
注意:du 对单个文件返回的是文件本身大小;对目录返回的是递归总大小,这和 ls -l 显示的“目录大小”完全不同。
要严格只排普通文件(排除目录),必须用 find
如果明确只要“文件”,不要任何目录(哪怕空目录),find 是唯一可靠方式:
find . -maxdepth 1 -type f -printf '%s %p\n' 2>/dev/null | sort -nr | head -20
说明:
-
-maxdepth 1限制只查当前目录一级,不进子目录 -
-type f确保只选普通文件 -
-printf '%s %p\n'输出“字节数 + 文件路径”,适合数值排序 -
sort -nr按数字逆序(最大在前);head -20可选,避免刷屏
这个组合不会受单位、隐藏文件、权限错误干扰,输出稳定可预期。唯一代价是路径带 ./ 前缀,但不影响识别。
真正容易被忽略的点是:ls -S 和 du 排序的对象根本不同——前者排的是 ls -l 第五列(文件系统记录的 size),后者排的是实际磁盘占用(含块对齐、稀疏文件等)。选哪个,取决于你到底想解决什么问题:快速 eyeball 大文件?还是定位真实空间杀手?










