要找出最大文件,最稳妥的办法还是把du和find配合起来用:先用du -ah | sort -hr做一轮定位,快速把体积大的目标揪出来;再用find -type f -size +阈值做精确筛选,直接锁定超出范围的文件,这两者刚好互补。相比之下,ls -lS只适用于当前目录,而且看不出真实的磁盘占用情况,关键的大文件很容易就漏掉。

直接查最大的文件,du + find 是最可靠的方式;ls -lS 只能看当前目录,且不递归、不处理硬链接、不反映真实磁盘占用,容易漏掉真正吃空间的文件。
用 find 找出整个系统中最大的文件(慎用)
全盘扫描开销大、耗时长,且可能因权限不足中断。建议限定路径,比如只查 /var、/home 或 /tmp:
find /var -type f -size +100M -exec ls -lh {} ;:列出所有大于 100MB 的文件,带可读大小和路径- 加
2>/dev/null忽略权限错误:find /var -type f -size +100M -exec ls -lh {} ; 2>/dev/null - 若要严格按大小排序取前 10:
find /var -type f -printf '%s %pn' 2>/dev/null | sort -nr | head -10 | awk '{print $2}' | xargs -r ls -lh
注意:-printf '%s %pn' 输出的是字节数,sort -n 按数值排,-r 倒序;awk 提取路径再用 ls -lh 补充可读格式。
用 du 配合 sort 查当前目录下最大文件(推荐日常用)
du 天然支持统计文件(不只是目录),但默认不显示单个文件——得加 -a:
du -ah . | sort -hr | head -20:列出当前目录及子目录下所有文件+目录,按大小倒序取前 20du -ah --max-depth=1 . | sort -hr | head -10:只查当前层(不含深层嵌套),更快更聚焦- 如果只想看文件(排除目录),加
grep -v '/$':du -ah . | grep -v '/$' | sort -hr | head -10
关键点:-h 和 sort -h 必须配套,否则 1K、234M、2G 会被当字符串排序,结果错乱。
为什么不用 ls -lS?
ls -lS 乍一看很直接,实际上它只负责三件事:把当前目录里的条目列出来、按照 ls 输出中的 size 字段进行排序、而且既不递归,也不会统计硬链接的真实占用;另外,这里的 size 指的是逻辑大小,不是磁盘块实际占用。也正因为如此,常见的误区往往就出在这里:
- 一个 2GB 的稀疏文件(
dd if=/dev/zero of=sparse bs=1G seek=1 count=0)用ls -l显示 0 字节,du -h才反映实际磁盘占用 - 日志轮转后残留的已删除但进程仍打开的文件,
ls根本看不到,du也统计不到,只有lsof + /proc/*/fd能揪出来 ls -lS不处理符号链接目标,du -L才能穿透软链算源文件大小
真正吃空间的大文件常藏在哪?
别一上来就扫全盘。先用 df -h 看哪个挂载点快满了,再针对性查:
df -h | grep '9[0-9]%|100%':快速定位高使用率分区- 对应分区下优先查:
/var/log(尤其journald、nginx、mysql日志)、/var/spool(邮件队列、打印缓存)、/root或/home/*下的临时包/镜像/数据库 dump - 查完记得确认是否被进程占用:
lsof +L1 /var/log看是否有已删但仍 open 的日志文件
最大文件往往不在显眼路径,而是在服务默认数据目录深处,或者被重命名隐藏(如 .old、.bak、~ 结尾)——find 的 -name 或 -regex 配合更有效。