ls -l输出的第二列是硬链接数,即指向该文件inode的目录项数量;普通文件默认为1,每建一个硬链接加1,删除任一硬链接减1,归零且无进程占用时内核才释放资源。

ls -l 输出的第二列就是硬链接数,不是文件大小,也不是权限位 —— 它是那个紧挨着权限字符串、看起来像数字的字段。
怎么看 ls -l 第二列是不是硬链接数
执行 ls -l filename,输出形如:
rw-r--r-- 3 chenkc chenkc 568 Apr 24 21:34 hello.txt
其中 3 就是硬链接数(link count),表示当前有 3 个目录项指向这个文件的 inode。它和文件大小(第五列 568)完全无关。
- 误把第五列当硬链接数,是最常见的误读
- 硬链接共享内容和 inode,所以所有硬链接的
ls -l第五列(大小)必然一致 - 新建一个硬链接后,该数字 +1;删除任意一个硬链接(包括原文件名),该数字 -1
- 硬链接数归零时,内核才真正释放磁盘空间和 inode —— 但前提是没进程在用它
为什么 stat 比 ls -l 更可靠
stat 明确标出 Links: 字段,避免歧义,还附带 inode 号、设备号等上下文:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
$ stat hello.txt File: hello.txt Size: 568 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 1837900 Links: 3
-
Links:行直接告诉你数值,不依赖列序或空格对齐 - 同时显示
Inode:,方便后续用find -samefile查所有硬链接 - 对脚本解析更友好:比如
stat -c "%h" filename直接输出链接数
怎么查出所有指向同一 inode 的硬链接路径
仅看数字不能知道“谁连了谁”,得靠 find -samefile:
- 先获取 inode:
ls -i filename | awk '{print $1}' - 再搜索:
find /path -xdev -samefile filename 2>/dev/null -
-xdev很关键:硬链接必须在同一文件系统,跨分区会漏结果 -
2>/dev/null过滤权限错误,否则大量Permission denied会冲掉有效路径 - 注意:不会列出软链接,因为软链接是独立 inode
硬链接数为 1 却删不掉文件?别只盯数字
即使 ls -l 或 stat 显示 Links: 1,文件仍可能删不掉或删了还占空间:
- 进程正打开它(
tail -f、vim编辑中、程序mmap)→ 内核维持引用,直到 fd 关闭 - 挂载点下有 bind mount 或 overlayfs 层 → 隐藏额外 inode 引用
- 使用 btrfs/zfs 快照 → 快照保留旧版本 inode,影响归零逻辑
- 用
lsof +L1查“已删除但仍有句柄打开”的文件(注意 +L1 是大写 L)
硬链接数本质是 inode 引用计数,它只反映当前目录项数量,不体现进程状态、文件系统快照或挂载层叠加 —— 单看那一行数字,永远只是局部快照。

















