如何在不遍历 Linux 中的整个文件系统的情况下枚举某个 inode 的所有硬链接路径?

如何在不遍历 Linux 中的整个文件系统的情况下枚举某个 inode 的所有硬链接路径?

我想知道所有具有相同 inode 编号的路径,我发现ls - 列出具有相同 inode 编号的所有文件? - Unix & Linux 堆栈交换然而,答案涉及使用该find实用程序遍历整个包含 inode 的文件系统,这对于具有大量文件数量的文件系统来说是不切实际的。

由于硬链接信息应该存储在文件系统的特定数据结构中,是否可以直接使用特定于文件系统的实用程序检索此类信息?

答案1

这只有在 inode 本身包含每个链接对象的位置时才有可能。这是不切实际的,因为如果其中一个文件在目录结构中移动,它需要对 inode 本身进行更多更新(和验证步骤)。在 inode 中拥有实际的文件路径意味着 inode 中的开销会大得多,因为它必须动态更改其大小以补偿路径更改或重命名,并且 inode 大小可能会有很大差异。

相反,inode 只包含链接数,而不包含去向或来源。此链接数可以是单个 32 位字段,不会导致 inode 大小发生变化,它可以“就地”更新,而不需要加载、修改并再次保存到其他位置的整个项目。

列出 inode 编号的唯一位置是目录对象本身。请记住,目录本质上只是将其他文件链接在一起的特殊文件。这样,对于文件移动,链接数保持不变,并且只是几次目录更新。对于删除或添加,这是一个目录更改和对 inode 的微小更新。

因此,正如您所发现的,唯一的方法就是遍历整个文件系统,搜索该 inode 的出现。

相关内容