【问题标题】:Is there any unique Ids for files that we can fetch through python?我们可以通过 python 获取文件的唯一 ID 吗?
【发布时间】:2018-01-24 10:21:33
【问题描述】:

我只是在寻找存储在目录中的文件是否有任何特定的 ID 如果是,我们如何通过 python 获取该 ID。我试过这个,我得到了一个 dict 。但是没有我看不到任何唯一 ID 的地方。

import os
cur = os.getcwd()

info = os.stat(cur)
print(info.__str__())

我得到了这样的东西:

os.stat_result (st_mode=33204, st_ino=21511460, st_dev=2049, st_nlink=1, st_uid=1001, st_gid=1001, st_size=378, st_atime=1516787918, st_mtime=1516787918, st_ctime=1516 >

我已经提到了st_ino,这意味着 inode 编号。但是当我尝试使用程序时,我发现它也发生了一些变化。
如果有任何此类 id 可用,我们可以获取具有这些 Id 的文件吗?

编辑: 因为变量持有id。我想知道在创建文件时文件系统中是否有类似的文件。

【问题讨论】:

  • 你可以检查文件的crc,我猜这是最好的主意
  • 检查crc的语法是什么?
  • filepath/filename 是独一无二的。
  • 如果文件路径改变了如何找到相同的文件?
  • @VikasDamodar 那不一样了!内容是一样的,不是文件!

标签: python file


【解决方案1】:

最接近文件 id 的东西(在文件系统中标识文件的一些唯一编号)称为 inode,这确实是 st​​at 在字段 st_ino 中返回的数字。

在某些情况下,即使文件名没有变化,此数字也可能会发生变化,例如当文件被另一个文件(副本)替换或删除并重新创建时。

如果您只是打开文件并对其执行读写操作,此数字不会改变。

查看此处了解有关 inode 的更多详细说明https://github.com/angrave/SystemProgramming/wiki/File-System,-Part-2:-Files-are-inodes-(everything-else-is-just-data...)

还要注意并非所有文件系统都有 inode,这是一个起源于 Unix 的概念。 vfat 没有这样的东西。

如果您只对文件名感兴趣,另一种获取唯一编号的方法是将文件名扩展到文件系统根目录(或 Windows 上的驱动器)的完整路径,然后在字符串上调用 hash()

这样做你会失去的是,在某些文件系统上,磁盘上的给定文件可能会使用多个名称(硬链接或软链接,我不会在这里展开差异)来访问。根据您的用例,这可能是也可能不是问题。

如果您正在寻找具有相同内容的文件,那就另当别论了。文件系统不关心文件的内容。要知道两个文件是否相同,您必须打开它们并进行比较。使用 python 你应该看看filecmp 模块。

比较多个文件的常用方法是依赖文件内容的哈希签名。例如,看看那个答案,看看如何为 MD5 做到这一点(有点过时,但很容易适应更现代的签名)Generating a MD5 signature of a file

【讨论】:

  • 我检查了st_ino。当我在上面给出cur 而当我提到文件名而不是cur 时,它变得不同了
  • 如果您提供目录名称(os.gtecwd() 返回的名称),那么您将获得该目录的 inode。如果您是文件的 inode,请将该文件的路径提供给 stat()。您还应该考虑 st_dev 字段,inode 仅在每个设备上都是唯一的。
  • 应该注意硬链接的 inode 编号是相同的,因此虽然 inode 理想情况下是唯一标识符,但多个文件名指向同一个 inode(也就是文件系统上的数据块)。
  • @Sergiy Kolodyaznyy:或者你可以反过来看,系统中的一个唯一文件可以有多个名称(路径)。我就是这么理解的:文件实际上就是你所说的“数据块”,不管它的名称(路径)如何。
  • @kriss 是的,没错。或者文件可能根本没有名称,如anonymous inodes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2020-04-18
  • 2014-05-02
相关资源
最近更新 更多