如何判断硬链接(hard link)文件?

2019年8月2日 / 37次阅读 / Last Modified 2019年8月6日

Python的os.path模块stat模块,都有函数用来判断一个文件是否为link文件。不过它们的判断都是文件是否为soft link软链接,或者说symbolic link符号链接。没有函数用来判断此文件是否为hard link硬链接文件。

我们自己写点Python代码来判断是否为硬链接文件,不过首先,我们需要先搞清楚硬链接的特点,主要有几下几点:

  • 硬链接文件,其实就是一个普通文件;
  • 硬链接文件的metadata中,能看到link数不为1,是一个大于1的整数;
  • 硬链接文件的指向一定与它自己在同一个分区里面,即同一个mount point下面;(在创建的时候,Linux系统就限制了不能跨区)
  • 指向相同的硬链接文件,Inode编号一致;
  • 删除某个硬链接文件,不会导致数据丢失,因为还有其它指向相同文件的硬链接存在;只有指向相同(Inode编号相同)的所有硬链接都删除的时候,才是真的删除。

有了以上特点,我们就可以写代码来判断和分析了。

os.stat函数判断硬链接

先上代码:

>>> import os
>>> fs = os.stat('123.txt')
>>> fs.st_nlink
2

123.txt文件,通过os.stat获取文件的metadata,发现st_nlink的值是2,这就能说明,123.txt是一个硬链接文件。

用Inode编号寻找相同指向的硬链接

根据硬链接的特点,一定在相同mount point挂载点下,存在Inode相同的文件。

获取Inode编号:

>>> fs.st_ino
2115578

遍历某个文件夹:

本小站已经介绍了两种遍历文件夹的方法,分别是使用os.walk函数,或者是递归遍历目录树的方法。从解决判断硬链接文件的角度看,这两个方法都可以使用。

也许还有一个函数,你能用得上,os.path.ismount(path)。这个函数判断某个路径是否为mount point(挂载点)。你可以试着从已有的那个硬链接文件的路径开始,一层层沿着它的路劲往上判断,直到找到mount point(一定可以找到,因为根路径就是mount point),然后从这个mount point开始遍历下面的所有文件,将每个文件的Inode编号与原有文件的进行对比判断,如果相同,就算找到了。

至于找到相同Inode的硬链接文件后怎么处理,这个就要看你自己的业务需求了。

-- EOF --

本文链接:https://www.pynote.net/archives/717

相关文章

    留言区

    电子邮件地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More

    麦新杰的Python笔记

    Ctrl+D 收藏本页


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top