Linux--文件链接

目录

1.建立软连接

2.建立硬链接

3.什么是软链接

Linux中软链接的应用场景

4.什么是硬链接

5.文件与目录的硬链接数

6.软链接与硬链接的区别

用户无法对目录建立硬链接,可以建立软连接。


在Linux中文件的链接有两种:1.软连接  2.硬链接

1.建立软连接

建立软链接指令:

ln -s 被链接文件名 建立链接名

举例:为log文件建立一个软链接,名字为log.soft.link

这里log.soft.link这个软链接指向了log这个文件。

同时我们通过指令:

ll -li

这里我们可以发现log文件与软链接的inode编号是不一样的。说明log与软链接是两个互相独立的文件

2.建立硬链接

建立硬链接指令:

ln 被链接文件 链接名

举例:为hello文件建立一个硬链接,链接名为hello.hard.link

还是指令 ll -li 查看文件inode编号

我们发现hello文件与对应的硬链接的inode编号是一样的,数字由1变成了2,但是软连接并没有改变数字。

 通过对比,我们可以得出结论:

软链接是一个独立的文件,硬链接不是,因为他没有独立的inode编号。

3.什么是软链接

Linux中的软链接与windows系统里桌面的快捷方式是相似的。

这里我们点击桌面快捷方式与在D盘的路径下点击Xshell.exe的效果是一样的,都是打开Xshell这个软件。

这里既然点击快捷方式与运行.exe文件的效果相似那么为什么要有快捷方式呢?

这是因为软件的.exe文件一般都会藏在较深的目录当中,不方便用户查找,因此才有文件的的快捷方式。

这里Linux使用软链接也是因为这个原因。

Linux中软链接的应用场景

这里我们创建一个myproc.c文件,并编写代码,用gcc编译生成可执行文件,这里我们可以直接执行可执行文件。但是在未来公司里做一个项目,并不是一个.exe文件直接暴露出来,他可能把项目以特定的目录文件组织起来的,里面有各种目录与文件。当我们每一次执行可执行程序时,我们还得把他的整体路径全部打出来才可以执行。这里他太挫了,因此这里我们可以直接给.exe文件建立一个软链接,放到与项目目录同一个目录中,这样我们每次执行.exe文件,只需 ./软链接名 即可。

因此我们可以说软链接快速的帮我们定位到了文件。

如:执行test1/test2目录里的myproc。

因此软连接我们可以理解为:

是一个独立的文件,有独立的indoe,软链接内容是指向目标文件的路径。

4.什么是硬链接

这里我们解释硬链接,以inode为切入口。

从上面的实验看:硬链接不是一个独立的文件(没有独立的inode)。这意味着访问硬链接与被链接文件时,访问的是同一个文件。

硬链接的本质是 在指定目录内部的一组映射关系:文件名<->inode的映射关系

以上面创建硬链接为例,这里我们删除hello

 这里我们可以发现:

我们发现数字由2变为了1。

当我们为一个文件创建一个硬链接,再把这个文件删掉,相当于给这个文件重命名。

这里文件并没有并删除(inode还存在),那么什么时候一个文件才会被真正的删除呢?

没有文件名与inode的映射关系。(没有人用)

我们知道文件是保存在磁盘上的,那么对于文件系统来说,他又是怎么知道这个文件没有人用的呢(文件怎么知道没有文件名指向自己)?

这里inode结构体里,有一个int ref_count 成员,用作引用计数:表明有几个文件名映射关系。当我们建立一个硬链接时,不仅会在当前目录里新增一个文件名与inode的映射关系,还会将inode里的引用计数加1。删掉一个文件时,会将文件inode里的引用计数减1,当引用计数为0时,就会将文件真正的删掉。

(注:新建一个文件时,文件inode里的引用计数为1)

同时这里我们还可以解释变化的那个数字是什么:

这里的数字是,硬链接数,记录了有多少个文件名指向对应的inode。

所以硬链接的本质是:

增加一个文件名与inode的映射关系。

5.文件与目录的硬链接数

这里我们新创建一个文件proj,一个新目录newdir,然后查看详细信息:

那么这里为什么新建文件的硬连接数是1,而目录的却是2呢?

这是因为文件就有一个文件名与inode的映射关系。

而对于目录,我们知道目录里有两个隐藏文件:  .  当前目录  ..  上一级目录(注:这里的  .  与  ..  是硬链接)

这里我们发现   .  的inode与newdir的inode是一样,因此对于1446001这个inode编号对应的inode来说有两个文件名与inode的映射关系,所以新建目录的硬链接数为2。同时也说明了为什么  表示当前目录(inode一样)

这里当我们在newdir里再新建一个目录dir:

我们发现硬链接数变为了3.那这是因为什么呢?

这里还是因为目录里的两个隐藏文件:

这里我们可以发现在新建的dir目录里  ..  的inode与newdir的一样,因此,在一个目录(newdir)里新建一个目录(dir),导致多了一个文件名与inode的映射关系,所以该目录(newdir)的硬链接数加1。同时也说明了为什么  ..   是上一级目录(inode一样)   

6.软链接与硬链接的区别

软链接是一个独立的文件,有自己的inode,属性与内用。

而硬链接只是一个文件名与inode的映射关系保存在目录里。

用户无法对目录建立硬链接,可以建立软连接

实验证明:

对根目录建立软链接:

可以看出可以对目录建立链接,里面内容与根目录一样。

对根目录建立硬链接:

建立链接失败。

为什么不能对目录进行建立硬链接:
 

这里我们知道Linux的目录结构是一个多叉树的样子,

如果我们在结尾创建一个硬链接指向根目录。

这里硬链接的所在的目录就多了一个新文件名与根目录inode的映射关系。如果他允许这样子做,那么我们在使用find命令时,我们都要指定路径的,然后会对路径里的文件名与inode进行对应查找,如果当路径中出现硬链接时,就会从硬链接所在目录直接查找到根目录的位置,从而可能形成一个环形结构,导致一直循环的进行查找。因此目录不能进行硬链接。

(注:目录里的  .    ..    是由操作系统设置的指向目录的硬链接,是一个特殊情况。这里是为例方便用户切换到当前目录与上一级目录)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 高级网络压缩 白皮书

英文版白皮书在这里 或 这里。 本文包括了对英文白皮书的翻译&#xff0c;和我觉得较重要的要点总结。 执行概述 Oracle Database 12 引入了一项新功能&#xff1a;高级网络压缩&#xff0c;作为高级压缩选项的一部分。 本文概述了高级网络压缩、其优点、配置细节和性能分析…

HTML+CSS:3D轮播卡片

效果演示 实现了一个3D翻转的卡片动画&#xff0c;其中每个卡片都有不同的图片和不同的旋转角度。整个动画循环播放&#xff0c;无限次。整个页面的背景是一个占据整个屏幕的背景图片&#xff0c;并且页面内容被隐藏在背景图片之下。 Code <div class"container"…

redis 入门及相关知识汇总

什么是 Redis &#xff1f; 1&#xff0c;相对于mysql &#xff0c;oracle &#xff0c; 这种关系西数据库&#xff0c; 我们还有非关系数据库服务&#xff0c;他的产生是为了&#xff0c;解决常规数据库的并发能力&#xff0c;传统的关系型数据库受限于IO 和性能瓶颈&#xff…

【解决方法】pdf密码忘了怎么办?

PDF文件可以加密&#xff0c;大家都不陌生&#xff0c;并且大家应该也都知道PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和offi…

父子组件通信$emit

文章目录 $emit 是vue中用于在子组件向父组件传递消息的一种机制。通过 $emit&#xff0c;子组件可以触发一个自定义事件&#xff0c;并向父组件传递数据。 例如&#xff1a; 以下是使用 $emit 的详细步骤&#xff1a; 1、子组件中触发自定义事件&#xff1a; <!-- ChildCom…

异步编程(JS)

前言 想要学习Promise&#xff0c;我们首先要了解异步编程、回调函数、回调地狱三方面知识&#xff1a; 异步编程 异步编程技术使你的程序可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成。 与此同时&#xff0c;你的程序也将在任务完成后显示…

微服务Spring Cloud架构详解

"Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff09;。分布式系统的协调导致了样板模式, 使用Spring Cloud开…

jupyter notebook删除kernel & conda 删除虚拟环境

jupyter kernelspec list #列出jupyter的所有kernel jupyter kernelspec remove kernel_name #删除特定的kerneljupyter kernelspec list 命令可以在任何激活的环境中运行&#xff0c;无论是 base 环境还是某个虚拟环境。该命令将列出所有已注册的 Jupyter 内核&#xff0c;包括…

技术变革与裁员潮下程序员的挑战与应对策略

引言 一对来自中国的工程师夫妻在美身亡,疑因谷歌裁员致悲剧发生。在技术变革下,裁员对于程序员的影响到底有多大? 技术变革的影响 在当今科技日新月异的时代,技术变革正以前所未有的速度颠覆各行各业。新兴技术如人工智能、云计算、大数据、区块链等不断涌现,对软件工…

Flowable_dmn决策引擎应用

Flowable官方文档 https://www.flowable.com/open-source/docs/dmn/ch02-Configuration 对flowable的bpmn和dmn应用都比较熟悉&#xff0c;前后应用了好几年&#xff0c;年终总结需要这部分&#xff0c;文档就写一下分享给大家&#xff0c;搭建和资源下载参考&#xff1a; flo…

Linux|centos操作系统|USB设备的驱动如何寻找和USB设置的自动挂载,卸载(备忘)

仅做一个记录&#xff0c;Linux命令实在太多了&#xff0c;有些比较有趣的命令还是需要记录一下哈 1&#xff0c; usb-devices命令 该命令会打印输出现有机器上所有的USB设备&#xff0c;此命令等同于cat /sys/kernel/debug/usb/devices 其中部分输出如下&#xff1a; T: …

怎么提升数据分析能力?——功法篇(下)

先来复习一下上篇提到的3个疑问&#xff1a; 为什么我做出来的分析总觉得没有别人的那么高级&#xff1f; 老板为什么总说我的分析“太浅了”&#xff1f; 数据分析师每天的工作就是取数做需求&#xff1f; 看完上篇讲的金字塔原理&#xff0c;如果你还有疑问&#xff0c;不妨再…

【江科大】STM32:TIM输入捕获(理论部分)

文章目录 IC&#xff08;Input Capture&#xff09;输入捕获PWM频率 知识点补充1. 滤波器的工作原理&#xff1a;2. 边沿检测器&#xff1a;自动化清零CNT输入捕获的基本结构PWMI基本结构滤波器和分频器的区别误差分析pwm.cmain.cIC.c PWM模式测频率和占空比 IC&#xff08;Inp…

手机备忘录设置提醒后不通知怎么办 解决方法来了

在这个快节奏的时代&#xff0c;我们每个人都像是旋转的陀螺&#xff0c;总有无数的事项需要记录。手机备忘录&#xff0c;无疑成为了我们的得力助手。它轻便、简单&#xff0c;随时随地都能捕捉那些一闪而过的灵感和任务。 然而&#xff0c;有时我们会遇到这样的困扰&#xf…

部署开源的团队协作工具

简介 Zulip 是一个开源的团队协作工具&#xff0c;拥有独特的基于主题的线程功能&#xff0c;结合了电子邮件和聊天的优点&#xff0c;使远程工作更加高效和愉快。它是唯一设计用于实时和异步对话的现代团队聊天应用程序。其核心优势包括&#xff1a; 适用于大型企业、领先的开…

CSS的浮动(float)布局效果

<!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <title>浮动(float)布局效果</title> <style> *{ margin: 0; padding: 0; box-sizing: border-box; } /*.box1{ width: 300px; height: 300px; background-colo…

react后端开发:如何根据特定ID创建新的用户信息?

以音乐app开发为例&#xff0c;我们想要在想要创建新的唱片库&#xff0c;就需要使用Post连接服务器端新建唱片ID&#xff0c;并在该ID处插入唱片信息。怎么做呢&#xff1f; 使用create同时创建id和唱片信息 existingAlbum await Album.create({ _id: albumId, ...albumDat…

Django入门,十分钟学会登录网页

我们假定你已经阅读了 安装 Django。你能知道 Django 已被安装&#xff0c;且安装的是哪个版本&#xff0c;通过在命令提示行输入命令 cmd黑窗口运行&#xff0c;不懂cmd百度一下 python -m django --version 如果没出现版本&#xff0c;就是没安装&#xff0c;那么用pip安装…

《WebKit 技术内幕》学习之十(2): 插件与JavaScript扩展

2 Chromium PPAPI插件 2.1 原理 插件其实是一种统称&#xff0c;表示一些动态库&#xff0c;这些动态库根据定义的一些标准接口可以跟浏览器进行交互&#xff0c;至于这个标准接口是什么都可以&#xff0c;重要的是大家都遵循它们&#xff0c;NPAPI接口标准只是其中的一种&a…

C语言第六弹---分支语句(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 分支语句 1、 逻辑操作符&#xff1a;&& , || , &#xff01;4.1、 逻辑取反运算符 &#xff01;4.2、 与运算符4.3、 或运算符4.4、 练习&#xff1a;闰…