当服务器磁盘空间不足时,df 可以告诉我们哪个挂载点快满了,但真正要定位“到底是谁占了空间”,通常就要使用 du。du 是 Linux 中查看目录和文件磁盘占用的常用命令。它非常适合排查大目录、大文件、日志堆积、缓存膨胀和备份文件过多等问题。
一、du 是什么?
du 是 disk usage 的缩写,用于统计文件或目录占用的磁盘空间。
它主要用于:
查看某个目录占用了多少磁盘空间
找出当前目录下哪些子目录最大
排查日志、缓存、备份文件占用过多的问题
和 df 配合定位磁盘空间不足
在清理文件前判断清理收益
需要注意的是:
二、常见使用语法与重点参数
du [选项] [文件或目录]
常用参数说明:
常见示例:
du -sh /var/logdu -h--max-depth=1 /datadu -ah /var/log | sort-hdu -sh *du -xh--max-depth=1 /
三、常用命令与使用场景
1. 查看目录总大小
du -sh /var/log
-s 表示汇总,-h 表示人类可读。
这是查看单个目录总占用最常见的写法,适合快速判断日志目录、数据目录或项目目录是否过大。
2. 查看当前目录下每个文件和目录大小
du -sh *
会列出当前目录下每个非隐藏文件和目录的大小。
如果需要包含隐藏目录,可以结合 shell 通配符或直接统计上级目录:
du -h--max-depth=1 .
3. 查看一级子目录大小
du -h--max-depth=1 /data
这个命令非常适合定位大目录。
例如 /data 空间占用高,可以先看一级目录:
du -h--max-depth=1 /data | sort -h
再进入最大的目录继续排查。
4. 按大小排序查看目录
du -h--max-depth=1 /var | sort -h
sort -h 可以按人类可读容量排序。
如果想让最大的目录显示在最前面:
du -h --max-depth=1 /var | sort -hr
5. 查找大文件和大目录
du -ah /var/log | sort -hr | head -20
-a 会同时显示文件和目录,适合快速找出最大的日志文件或压缩包。
对非常大的目录执行该命令可能较慢,建议先用 --max-depth=1 缩小范围。
6. 只统计当前文件系统
du -xh --max-depth=1 /
-x 表示不跨越文件系统边界。
这在根目录 / 下排查空间时很有用,可以避免把 /data、/mnt 等单独挂载的磁盘也统计进去。
7. 排除指定目录
du -h --max-depth=1 /data --exclude='cache'
可以排除名称匹配的目录或文件。
例如统计项目目录时排除依赖目录:
du -h --max-depth=1 . --exclude='node_modules'
8. 查看多个目录总大小
du -sh /var/log /data /backup
适合同时比较多个关键目录的空间占用。
如果想显示总计:
du -sch /var/log /data /backup
9. 结合 find 查找大文件
find /var/log -type f -size +100M -exec du -h {} +可以找出 /var/log 下大于 100M 的文件,并显示大小。
如果想按大小排序:
find /var/log -type f -size +100M -exec du -h {} + | sort -hr
四、常见问题与建议
1. du 执行很慢怎么办?
du 会遍历目录树,大目录、大量小文件或网络挂载都会导致执行较慢。
建议:
2. du 和 df 结果不一致怎么办?
常见原因包括:
文件被删除但进程仍然占用
目录下有挂载点
权限不足导致部分目录统计失败
文件系统预留空间或元数据占用
可以使用:
lsof | grep deleted
排查已删除但仍被进程打开的文件。
3. 为什么 du -sh * 看不到隐藏目录?
因为 * 默认不匹配以 . 开头的隐藏文件或目录。
可以用:
du -h --max-depth=1 .
这样会统计当前目录本身下一层内容,包含隐藏目录。
4. 生产环境清理前应该注意什么?
建议先看再删:
du -h --max-depth=1 /var | sort -hr
确认目录来源后再处理。不要仅凭文件大就直接删除,尤其是数据库文件、业务上传文件、正在写入的日志和容器运行目录。
五、常用命令速查
du -sh /var/logdu -sh *du -h --max-depth=1 .du -h --max-depth=1 /datadu -h --max-depth=1 /data | sort -hdu -h --max-depth=1 /var | sort -hrdu -ah /var/log | sort -hr | head -20du -xh --max-depth=1 /du -h --max-depth=1 . --exclude='node_modules'du -sch /var/log /data /backupfind /var/log -type f -size +100M -exec du -h {} + | sort -hr
六、总结
du 是定位目录和文件空间占用的核心命令。建议重点掌握:
du -sh /pathdu -h --max-depth=1 /pathdu -ah /path | sort -hr | head
排查磁盘空间问题时,可以先用 df -h 判断哪个挂载点空间不足,再用 du 从对应目录逐层定位大目录或大文件。这样比盲目清理文件更准确,也更安全。