当前位置: 首页 > news >正文

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

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

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

硬链接文件,其实就是一个普通文件;

硬链接文件的metadata中,能看到link数不为1,是一个大于1的整数;

硬链接文件的指向一定与它自己在同一个分区里面,即同一个mount point下面;(在创建的时候,Linux系统就限制了不能跨区)

指向相同的硬链接文件,Inode编号一致;

删除某个硬链接文件,不会导致数据丢失,因为还有其它指向相同文件的硬链接存在;只有指向相同(Inode编号相同)的所有硬链接都删除的时候,才是真的删除。

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

先上代码:

>>> 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 --

相关文章:

  • linux管理员 pdf,Linux系统管理员日常使用命令.pdf
  • Linux vim不可用,ubuntu15安装vim却提示vim包不可用
  • linux fpm rpm,Linux系统下使用FPM制作RPM的方法
  • linux文件下脚本权限,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  • c语言程序设计逗号作用,关于c语言逗号表达式的运算规则知识点
  • C语言开发动态内存的方法,C语言动态内存分配的详解
  • C语言中99 0,C语言中 \0 代表什么?
  • c语言数字星期几,计算任何一天是星期几的C语言源代码.
  • 图片c语言是输出矩阵吗,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
  • ubuntu nfs linux,Ubuntu 14.04下NFS安装配置
  • i686-pc linux gnu,交叉编译: --host --build --target到底什么意思?
  • android 字母好友,如何获取android手机联系人并按字母展示(二)
  • sony 播放器 android,Hi-Res Audio Player
  • adb更新android分区,Android adb升级OTA
  • android 反射执行方法,Android中怎么通过反射调用setUsbTethering()方法
  • 0x05 Python数据分析,Anaconda八斩刀
  • Brief introduction of how to 'Call, Apply and Bind'
  • docker python 配置
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • github从入门到放弃(1)
  • happypack两次报错的问题
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • java中的hashCode
  • jdbc就是这么简单
  • jquery cookie
  • Koa2 之文件上传下载
  • 阿里云Kubernetes容器服务上体验Knative
  • 复习Javascript专题(四):js中的深浅拷贝
  • 前端攻城师
  • 双管齐下,VMware的容器新战略
  • 物联网链路协议
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 用jquery写贪吃蛇
  • 容器镜像
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​业务双活的数据切换思路设计(下)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #100天计划# 2013年9月29日
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #每天一道面试题# 什么是MySQL的回表查询
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (2)STL算法之元素计数
  • (day 12)JavaScript学习笔记(数组3)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)大型网站架构演变和知识体系
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net 4.0发布后不能正常显示图片问题
  • .NET 8.0 发布到 IIS
  • .NET 常见的偏门问题
  • .netcore 获取appsettings