linux 如何使用Python识别硬链接?

7ajki6be  于 2023-04-20  发布在  Linux
关注(0)|答案(4)|浏览(113)

我想知道是否有可能识别一个文件(或链接)是否是一个 * 硬链接 *,在Linux上.例如,如果我创建:

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

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

if is_hardlink("file_10MB_link1"):
    pass

如何使用Python检查文件是否为 * 硬链接 *?

2lpgd968

2lpgd9681#

我相信你正在寻找“文件有一个链接计数大于1”
为此,您可以用途:

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

flvlnr442#

不,这不可能。没有什么东西可以区分原始文件和硬链接。它们只是两个名称,引用相同的inode编号,表示文件内容。
您可以使用Anthony Sottile的答案中的代码来判断文件是否有多个链接,但您无法判断哪个是原始链接。

sczxawaw

sczxawaw3#

答案是,这取决于你使用的文件系统(确切的)操作系统。例如,如果你使用的是NTFS(尽管在原生Linux环境中不太可能),它允许广泛的NTFS特定 * 功能 *,包括 * 硬链接 * 和 * 连接 *。因此,在Windows中,他们使用链接号进行硬链接,而Linux操作系统使用inode。
您需要特定的内核驱动程序或取证操作系统才能读取所有这些,因为 * 正常 * Linux只使用 * inode *,并且需要计数和时间戳分析以确定原始文件与后来创建的硬链接。
因为Python可以通过以下方式创建硬链接和 * 软链接 *:

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

(TL;DR上面的长文档)应该有一种方法让你检查链接类型,虽然它可能需要相当多的光盘处理(搜索和比较)。
为了准确的检测,检查内置的os函数,在this answer中解释。
[islink(),parse_reparse_buffer(),readlink()]

b09cbbtk

b09cbbtk4#

TL;DR:以下是您的操作方法:

import os
def are_hardlinked(f1, f2):
    if not (os.path.isfile(f1) and os.path.isfile(f2)):
        return False
    return os.path.samefile(f1, f2) or (os.stat(f1).st_ino == os.stat(f2).st_ino)

对于linux,根据定义,如果它们指向相同的inode,则它们是硬链接的,因此比较st_ino就可以了。
对于窗口,首先确定硬链接对应的窗口是什么;),然后从那里开始:)...然而,对于所有合理的定义os.path.samefile(f1, f2)都有可能覆盖你。

相关问题