du用于统计目录磁盘占用(含硬链接去重),find用于查找大文件(按逻辑大小,需加-xdev和-type f避免误扫);二者结果差异源于统计逻辑不同,幽灵文件需用lsof +l1定位。

du 和 find 是 Linux 下排查磁盘空间问题最直接有效的两个命令,但它们用途不同、行为差异大,混用或参数写错会导致结果不准甚至卡死。
根目录快满了?先别急着删文件,得知道谁占得最多。du -sh 本身只显示当前目录总大小,没用;真正关键的是加 –max-depth=1 限制层级,并配合 展开一级内容:
-
du -sh / 2>/dev/null—— 查根下所有一级目录/文件大小,2>/dev/null过滤无权限报错(比如/proc、/sys) -
du -sh /var/* 2>/dev/null | sort -hr—— 进入疑似大户后,按大小倒序排列,一眼看出哪个子目录最吃空间 - 注意:
-h是可读单位(K/M/G),但排序时必须用sort -hr(-h支持人类单位,-r倒序),仅用sort -n会把 10G 排在 2G 前面(因为字符串比较)
du 只能告诉你“哪块地大”,find 才能指出“哪栋楼超限”。常见错误是直接 find / -size +100M,结果扫到 /proc、/dev 或挂载的 NFS 盘,要么报错,要么卡住:
- 必须加
-xdev:限定只查当前文件系统,避免跨分区/挂载点扫描 - 必须加
-type f:排除目录、设备文件、socket 等非普通文件,否则/proc下一堆伪文件会被误判 - 大小写敏感:
+100M中的M必须大写,小写m表示 512 字节块,+100m≈ 50KB,完全不是你要的“大文件” - 想看大小?接
-ls或管道给ls -lh:find /home -xdev -type f -size +500M -ls
有时 du -sh /var/log 显示 2G,但 find /var/log -type f -size +10M 找不出几个文件——这不是命令错了,而是两种统计逻辑不同:
-
du统计的是实际占用的磁盘块(考虑硬链接去重),find -size查的是文件stat返回的逻辑大小(每个硬链接都算一份) - 更隐蔽的情况:某个进程还在写一个已被
rm的文件(如日志),find找不到它(路径已删),但du仍计入(inode 没释放)。用lsof +L1能揪出这类“幽灵大文件” -
du –apparent-size可强制按逻辑大小统计,和find -size对齐,但默认不用它——你真正要清理的是磁盘块,不是文件名长度
看到 /var/log/journal 占了 8G,别立刻 rm -rf。journalctl 日志有压缩机制,直接删可能破坏 systemd 日志索引:
- 查 journal 实际保留策略:
journalctl –disk-usage、journalctl –vacuum-size=500M - 临时清空:
journalctl –rotate && journalctl –vacuum-time=2d(保留两天) - 对
/tmp下的临时文件,优先用tmpwatch或systemd-tmpfiles管理,而不是手动find … -delete -
find … -delete风险极高:没加-print预览就执行,删错不可逆。务必先跑一遍find … -print确认路径,再换-delete
真正麻烦的从来不是命令记不住,而是不知道该信 du 的块数,还是 find 的字节数,或者进程还攥着哪个已删文件的句柄。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/272776.html