来自inode的Python文件名?

Posted

技术标签:

【中文标题】来自inode的Python文件名?【英文标题】:Python filename from inode? 【发布时间】:2013-09-14 21:53:37 【问题描述】:

我正在从 OS X 上的旧应用程序转换文件。出于当时一定很好的原因,它通过索引节点编号在其数据库中记录相关文件。 (我认为 Apple 将其称为 FileID。)

给定一个文件名,我可以使用 os.stat() 在 Python 中找到 inode。但是有没有一种 Python 方法可以找到给定 inode 编号的名称?

做不到这一点,我可以想到另外两种方法:

    扫描文件夹中的所有文件以收集其所有inode编号,并将其保存在字典中以供快速参考。

    使用 os.system('find /folder/folder -inum 1234') 并解析我所追求的输出。我想这确实和上面做的一样,但由操作系统完成。

我更喜欢 Python 原生解决方案,但如果有任何其他建议,我将不胜感激。

这将是 OS X 10.5 或 6 上的 Python2。

【问题讨论】:

基本上,给定一个 inode 编号,没有简单的方法来确定文件的名称。很久以前,第 7 版 Unix 提供了工具 ncheck 来“从文件编号生成文件名”(它是一个先驱,与 icheck,到无所不能的 fsck)。但这也涉及扫描整个文件系统。 【参考方案1】:

看来您必须bruteforce it。文件名指向 inode。 inode 本身不包含对文件名的引用。您也可以有多个指向同一个 inode 的硬链接(文件系统中的位置或文件名)。

您可以在此页面上看到the elements of an inode struct。文件名不存在。

【讨论】:

+1 重点(在我看来)是可能有多个名称链接到一个inode。一个并不比另一个更“正确”。所以 OP 需要一个约定来确定哪个是他想要的名字。 是的,我知道可以有多个链接。但是在这种情况下,文件的创建方式意味着只有一个链接。实际情况更加复杂,因为有些文件已经不存在了,同时这个 inode 可能已经被其他文件使用了。【参考方案2】:

在 OSX 上有 volfs,但这实际上可能比您的 1. 方法慢。

因此,我会使用您的 1. 方法,但要考虑一些重要的方面:

inode 可以指向多个 files(硬链接)。 您必须确保它仍然是相同的设备。

您的 2. 方法与第一种方法基本相同,除了额外的分叉开销,更重要的是基本上一次又一次地运行相同的昂贵枚举,而不是一次填充地图。 p>

【讨论】:

我没有考虑过使用“查找”的额外开销。我想这取决于我是要按需查找所有文件还是只查找一些文件。但是根据生成的错误消息的数量,解析 find 的输出可能会很复杂。 你不必查看错误,因为如果有命中,它将在标准输出而不是标准错误 @mnagel 然后你必须再次查看stderr 以确定是否有错误(例如,没有读取子目录的权限)或者inode 是否只是在有没有命中。

以上是关于来自inode的Python文件名?的主要内容,如果未能解决你的问题,请参考以下文章

Linux中文件目录的inode 号有啥用?

inode是啥

inode

inode和block

VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里

文件的inode号操作