如何使用 python 识别硬链接?

How to identify a hardlink using python?

我想知道是否可以识别一个文件(或link)是否是hardlink,在Linux。例如,如果我创建了:

dd if=/dev/urandom bs=1024 count=10000 of=file_10MB conv=notrunc
ln file_10MB file_10MB_link1

我想创建一个检查函数,可以这样使用:

if is_hardlink("file_10MB_link1"):
    pass

如何使用 Python 检查文件是否 hardlink?

我相信你正在寻找 "files which have a link count greater than 1"

为此你可以使用:

def more_than_one_link(filename):
    os.stat(filename).st_nlink > 1

不,这不可能。没有什么可以区分原始文件和硬 link。它们只是引用相同 inode 编号的两个名称,代表文件内容。

您可以使用 Anthony Sottile 的回答中的代码来判断该文件是否包含多个 link,但您无法判断哪个是原始文件。

答案是它取决于您使用的文件系统 (准确)OS。例如,如果您使用的是 NTFS(虽然在本机 Linux 上下文中不太可能)它允许范围广泛的 NTFS specific features 包括 hardlinks 路口 。因此,在 Windows 中,他们使用 link 数字作为硬 links,Linux OS 使用 inode。

您需要特定的内核驱动程序或取证程序 OS 才能读取所有 ose,如 正常 Linux仅使用 inodes,需要计算和 time-stamp 分析以确定原始文件与后来创建的 hardlink(s)。

因为 python 可以通过以下方式创建 hardlinkssoftlinks

os.link()    # Create a hard link
os.symlink() # Create a symbolic link

(TL;DR 上面的长文档)应该有一种方法可以让您检查 link 类型,尽管它可能需要相当多的光盘处理(搜索和比较)。

为了准确检测,请检查 built-in os 函数,在 this answer.
中进行了解释 [是link(), parse_reparse_buffer(), 读link()]