我想知道是否有可能识别一个文件(或链接)是否是一个 * 硬链接 *,在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检查文件是否为 * 硬链接 *?
2lpgd9681#
我相信你正在寻找“文件有一个链接计数大于1”为此,您可以用途:
def more_than_one_link(filename): os.stat(filename).st_nlink > 1
flvlnr442#
不,这不可能。没有什么东西可以区分原始文件和硬链接。它们只是两个名称,引用相同的inode编号,表示文件内容。您可以使用Anthony Sottile的答案中的代码来判断文件是否有多个链接,但您无法判断哪个是原始链接。
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()]
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)都有可能覆盖你。
st_ino
os.path.samefile(f1, f2)
4条答案
按热度按时间2lpgd9681#
我相信你正在寻找“文件有一个链接计数大于1”
为此,您可以用途:
flvlnr442#
不,这不可能。没有什么东西可以区分原始文件和硬链接。它们只是两个名称,引用相同的inode编号,表示文件内容。
您可以使用Anthony Sottile的答案中的代码来判断文件是否有多个链接,但您无法判断哪个是原始链接。
sczxawaw3#
答案是,这取决于你使用的文件系统和(确切的)操作系统。例如,如果你使用的是NTFS(尽管在原生Linux环境中不太可能),它允许广泛的NTFS特定 * 功能 *,包括 * 硬链接 * 和 * 连接 *。因此,在Windows中,他们使用链接号进行硬链接,而Linux操作系统使用inode。
您需要特定的内核驱动程序或取证操作系统才能读取所有这些,因为 * 正常 * Linux只使用 * inode *,并且需要计数和时间戳分析以确定原始文件与后来创建的硬链接。
因为Python可以通过以下方式创建硬链接和 * 软链接 *:
(TL;DR上面的长文档)应该有一种方法让你检查链接类型,虽然它可能需要相当多的光盘处理(搜索和比较)。
为了准确的检测,检查内置的os函数,在this answer中解释。
[islink(),parse_reparse_buffer(),readlink()]
b09cbbtk4#
TL;DR:以下是您的操作方法:
对于linux,根据定义,如果它们指向相同的inode,则它们是硬链接的,因此比较
st_ino
就可以了。对于窗口,首先确定硬链接对应的窗口是什么;),然后从那里开始:)...然而,对于所有合理的定义
os.path.samefile(f1, f2)
都有可能覆盖你。