来自inode的Python文件名?

来自inode的Python文件名?,python,Python,我正在转换OSX上的一个旧应用程序中的文件。由于当时一定很好的原因,它会按索引节点号在数据库中记录相关文件。(我认为苹果称之为FileID。) 给定一个文件名,我可以使用os.stat()在Python中找到inode。但是,有没有一种Python方法可以找到给定inode编号的名称 如果做不到这一点,我可以想出另外两种方法: 扫描文件夹中的所有文件以收集其所有inode编号,并将其保存在字典中以供快速参考 使用os.system('find/folder/folder-inum 1234')并

我正在转换OSX上的一个旧应用程序中的文件。由于当时一定很好的原因,它会按索引节点号在数据库中记录相关文件。(我认为苹果称之为FileID。)

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

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

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

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

  • 我更喜欢Python本机解决方案,但如有其他建议,我将不胜感激


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

    看起来您必须这样做。文件名指向索引节点。索引节点本身不包含对文件名的引用。您还可以有多个指向同一索引节点的硬链接(文件系统中的位置或文件名)

    你可以在这页上看到。文件名不在那里

    OSX上有,但这实际上可能比您的1慢。接近

    因此,我会使用你的1。方法,但考虑一些重要的位:

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

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

    +1(在我看来)突出的一点是,可能有多个名称链接到一个inode。一个并不比另一个更“正确”。所以OP需要一个约定来确定哪一个是他想要的名字。是的,我知道可以有多个链接。但是,在本例中,文件的创建方式意味着只有一个链接。实际上更复杂的是,有些文件已经不存在了,同时inode可能已经用于其他文件。基本上,给定inode编号,没有简单的方法来确定文件名。很久以前,第7版Unix提供了工具
    ncheck
    “从文件号生成文件名”(这是一个前置游标,带有
    icheck
    ,指向万能的
    fsck
    )。但这也涉及到扫描整个文件系统,我没有想到使用“find”会带来额外的开销。我想这取决于我是根据需要查找所有文件,还是只查找少数文件。但是解析find的输出可能会很复杂,这取决于生成的错误消息的数量。您不必查看错误,因为如果有命中,它将位于stdout not中stderr@mnagel然后,您必须再次查看
    stderr
    ,以确定是否存在错误(例如,没有读取子目录的权限)或者如果在没有命中的情况下没有找到
    inode