ls -s 按文件逻辑大小(st_size)降序排列,不反映磁盘实际占用;常见误解包括误认其排序递归、目录大小含子内容、单位默认为mb等,实际需搭配-lh等选项或改用du定位真实磁盘大户。

ls -S 默认排序行为和常见误解
ls -S 按文件大小降序排列(最大在前),但它只比较「逻辑大小」,即 stat() 返回的 st_size 字段,不等于磁盘实际占用。比如空洞文件(sparse file)或硬链接多的文件,ls -S 显示的大小可能远小于 du 结果。
容易踩的坑:
-
ls -S不递归,仅作用于当前目录一级 - 对目录本身,
ls -S显示的是目录项数量(通常 4096 字节),不是其子内容总大小 - 默认不显示单位,大文件易误读(如
123456789是字节,不是 MB)
加参数让 ls -S 更实用
单独用 ls -S 输出信息有限,必须搭配其他选项才能真正定位大文件:
-
ls -lS:显示详细信息 + 按大小排序,关键看第 5 列(size 字段) -
ls -lSh:加-h自动转为 K/M/G 单位,人眼可读性强得多 -
ls -lSht:再加-t会按修改时间二次排序(注意:-t优先级高于-S,实际是先按时间排,再按大小?错——ls多个排序选项时,最后指定的生效,所以-S覆盖-t) -
ls -lS --block-size=MB:强制单位为 MB(但注意:不是所有ls版本支持,GNU coreutils ≥ 8.25 可用)
为什么 ls -S 有时看起来没生效?
典型现象:ls -lS 输出和 ls -l 一样,大小列数值乱序。原因通常是:
- 终端宽度不足,
ls自动切为多列横向排版(此时排序仍发生,但视觉上不直观),加-1强制单列可验证 - 文件名含空格或特殊字符,导致列对齐错乱,误判顺序;可用
ls -lS --quoting-style=shell-escape查看真实字段边界 - 使用了别名(如
alias ls='ls --color=auto'),而别名未继承-S;检查用type ls或直接运行/bin/ls -lS - 某些 shell(如 zsh)开启 glob 扩展后,通配符未引号包裹,
*被提前展开干扰命令意图
替代方案:当 ls -S 不够用时该用谁?
ls -S 适合快速浏览,但查「真正占磁盘多的文件」必须换工具:
-
du -sh * | sort -hr:统计每个条目实际磁盘用量(含子目录),-h可读,-r降序;注意*不匹配隐藏文件,要加.*需谨慎(避免.和..) -
find . -type f -exec du -h {} + | sort -hr | head -20:精准找普通文件,排除目录,限制输出前 20 -
ncdu:交互式磁盘用量分析器,比纯命令更直观,但需额外安装
真正麻烦的地方在于:你得想清楚——要的是「文件声明大小」还是「磁盘块占用」。前者用 ls -lSh,后者必须用 du 系列。混用会导致删错文件却释放不了空间。











