如何使用 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 可以通过以下方式创建 hardlinks 和 softlinks:
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()]
我想知道是否可以识别一个文件(或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 可以通过以下方式创建 hardlinks 和 softlinks:
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()]