最直接方式是执行ls -i,它以“inode号 文件名”格式快速列出当前目录非隐藏文件的inode编号;加-a可包含隐藏文件,但会混入.和..。

用 ls -i 快速列出当前目录所有文件的 inode 号
这是最直接、开销最小的方式。在当前目录执行:ls -i,每行输出格式为 “inode号 文件名”。它不递归、不排序、不统计,只做一次目录项读取,适合快速扫一眼分布是否异常(比如大量重复 inode 号,说明存在硬链接)。
注意:ls -i 不显示隐藏文件(以 . 开头的),如果要包含,得加 -a:运行 ls -ia;但此时输出会混入 . 和 .. 两个特殊条目(它们各自有独立 inode,别误当成普通文件)。
常见误操作:
- 直接 ls -i | wc -l 想统计文件数 → 错!这会把 inode 号和文件名一起计数,结果翻倍;
- 在含几十万文件的目录下盲目 ls -i → 可能卡住或内存溢出,应改用 find。
用 find + stat 统计 inode 出现频次(查硬链接或小文件堆积)
当你怀疑某个 inode 被多个文件共用(硬链接),或想看哪些 inode 高频出现(比如日志轮转残留),需要聚合统计。这时不能靠 ls -i,而要用:
find . -maxdepth 1 -type f -printf '%i\n' | sort | uniq -c | sort -nr | head -10
说明:
- -maxdepth 1 限制只查当前目录(不含子目录);
- -type f 排除目录、符号链接等非普通文件;
- -printf '%i\n' 直接输出每个文件的 inode 号(比 stat 调用快得多);
- sort | uniq -c 统计每个 inode 出现次数;
- head -10 只看前 10 个高频 inode —— 如果某 inode 出现几百次,基本就是硬链接滥用或日志碎片。
⚠️ 注意:find . 会进入 . 和 ..,但 -maxdepth 1 已规避;若目录里有大量子目录且你只想统计“叶子文件”,必须加 -type f,否则目录也会被计入 inode 统计。
用 df -i 看当前目录所在分区的 inode 总体使用率
df -i .(注意末尾那个点)是关键动作。它不会查当前目录本身,而是定位到该目录所在的挂载点,并显示该分区的 inode 总量、已用、剩余和百分比(IUse% 列)。
为什么必须用 df -i . 而不是 df -i?
- df -i 默认列出所有挂载点,包括 tmpfs、devtmpfs 这类内存文件系统,它们的 IUse% 高是正常的,干扰判断;
- df -i /path 会自动解析 /path 所在的真实挂载点,精准聚焦业务分区(如 /var 或 /home);
- CentOS 7 默认用 xfs 文件系统,df -i 对其完全兼容;但某些容器环境或精简镜像可能不显示 IUse% 列,此时需 fallback 到 stat -f . 查 Inodes: 和 Inodes free: 字段手动计算。
遇到 No space left on device 却 df -h 显示空间充足时,优先查 inode
这是 CentOS 7 上最典型的 inode 耗尽症状。错误信息本身不提 inode,容易误判为磁盘满。此时必须立刻执行:
- df -i . → 看对应挂载点 IUse% 是否已达 100%;
- 若确认耗尽,再用 find . -maxdepth 1 -type f | wc -l 快速估算当前目录文件数(避开 ls 的内存陷阱);
- 重点排查 /var/log、/tmp、应用临时目录 —— 这些地方的小文件(尤其是 .log、.tmp)最容易撑爆 inode。
别试图用 rm -rf * 清理海量小文件:shell 通配符展开会先生成超长参数列表,大概率触发 Argument list too long 或直接卡死。正确做法是分批删:
- find . -maxdepth 1 -name "*.log" -mtime +30 -delete(按时间删);
- 或用 find . -maxdepth 1 -name "*.tmp" -print0 | xargs -0 -n 1000 rm -f(控制每次删 1000 个)。
真正麻烦的不是查,而是定位到具体哪个子目录在疯狂产小文件 —— 这需要结合 find 嵌套统计,而不是盯着当前目录打转。











