ls -i 胜在够快、够轻,只会直接给出编号;真要看完整的 inode 元数据,还得用 stat,比如硬链接数、时间戳这类信息都要靠它来拿。至于 find -inum,更适合拿来反向查路径。还有一个细节很关键:如果看到 Links:0,通常说明文件虽然已经被删除,但占用的空间还没真正释放,这时候就需要配合 lsof +L1 一起定位。

ls -i,它最快、最轻量,适合一眼确认编号;但只靠它容易漏关键信息——比如硬链接数为 0 的文件,ls -i 不会告诉你它已被删除却仍在被进程占用。
用 ls -i 快速查单个文件 inode 号
这是最常用也最容易上手的方式,不依赖额外参数,输出即见编号:
ls -i test.c→ 输出形如123456 test.c,左边数字就是 inode 号- 别只输
ls -i然后扫一眼数字就走——没带文件名时,你看到的只是 inode 号列表,无法对应到具体文件,极易误判 - 想同时看权限和大小?用
ls -li,inode 号会固定在最左列,后面紧跟权限、所有者、大小等字段 - 批量查目录下所有文件:
ls -i /var/log;若路径含空格或特殊字符,ls -i仍安全,不用额外转义
用 stat 查真实元数据,不只看编号
stat 才是真正能够直接读取磁盘 inode 表原始结构的命令;ls -i 充其量只是把目录项做了个解析,像那些“文件已经删了但空间还没释放”、硬链接计数,以及更细的时间戳信息,它其实都看不出来。
stat /etc/hosts默认输出冗长,重点盯住Inode:和Links:字段;Links: 0意味着文件已被unlink(),但仍有进程打开着,空间不会释放- 脚本里别 parse 默认输出——换行、缩进、字段顺序都不可靠;改用格式化:
stat -c "%i %h %y" /tmp/file,%i是 inode 号,%h是硬链接数,%y是 mtime(ISO 格式) - 注意
atime常不更新:多数系统挂载时启用了relatime,普通cat不触发刷新;mtime才反映内容是否真被改过,ctime则只要 chmod/chown/重命名就变——它不是“创建时间”
用 find -inum 反查路径,特别是硬链接或已删文件
当你从 lsof +L1 或 stat 输出里拿到一个 inode 号,想定位它在哪几个路径下存在,就得靠 find:
find / -inum 1234567 2>/dev/null→ 递归搜索根目录,2>/dev/null抑制权限错误干扰- 同一个 inode 可能返回多个路径,说明存在硬链接;但不会列出已删除却仍被打开的文件——这类文件只在
/proc/PID/fd/下可见 -inum在 ext4/XFS 上可靠,但在 NFSv3 等网络文件系统上可能失效,因为服务端做了 inode 映射转换
别只盯着 inode 号,df -i 和 stat -f 才管总量
inode 耗尽和磁盘空间满是两回事,df -h 看不出问题,得单独查 inode 使用率:
df -i给的是四舍五入后的百分比,小分区(比如/boot)总共才几万个 inode,100% 很快就到;更准的是stat -f /,看输出里的Inodes:和Inodes Free:差值stat -f和stat -L互斥:加-L会解析符号链接目标,加-f是查文件系统,两个一起用会报错- 不同文件系统字段名略有差异(ext4 写
Inodes Free:,XFS 可能写free inodes),但数值含义一致
Links: 0 的文件还在哪个进程里开着,那个高频出现的 inode 号是不是一堆日志硬链接堆出来的,或者 df -i 显示 98% 时你得立刻判断是真耗尽还是某目录下塞了几十万小文件。这些没法靠一条命令解决,得连着看、比着看、带着上下文看。