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.mfbz.cn/a/341496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

Docker 配置 Gitea Drone 搭建 CI/CD 平台 配置 Gitea 服务器来管理项目版本 本文的IP地址是为了方便理解随便打的&#xff0c;不要乱点 首先使用 docker 搭建 Gitea 服务器&#xff0c;用于管理代码版本&#xff0c;数据库选择mysql Gitea 服务器的 docker-compose.yml 配…

RK3568 移植Ubuntu

使用ubuntu-base构建根文件系统 1、到ubuntu官网获取 ubuntu-base-18.04.5-base-arm64.tar.gz Ubuntu Base 18.04.5 LTS (Bionic Beaver) 2、将获取的文件拷贝到ubuntu虚拟机,新建目录,并解压 mkdir ubuntu_rootfs sudo tar -xpf u

用flinkcdc debezium来捕获数据库的删除内容

我在用flinkcdc把数据从sqlserver写到doris 正常情况下sqlserver有删除数据&#xff0c;doris是能捕获到并很快同步删除的。 但是我现在情况是doris做为数仓&#xff0c;数据写到ods&#xff0c;ods的数据还会通过flink计算后写入dwd层&#xff0c;所以此时ods的数据是删除了…

SPN 泄露 | 扫描 | 维护

SPN 泄露 当Service Principal Names&#xff08;SPNs&#xff09;泄露时&#xff0c;可能会引发严重的安全风险&#xff0c;特别是在使用Kerberos身份验证的环境中。 身份欺骗&#xff08;Identity Spoofing&#xff09;&#xff1a; 攻击者可以用泄露的SPN来伪装成合法的服…

芯驰E3340软件编译以及更新步骤

打开已有工程File->Open Solution: 东南项目&#xff1a;e3340\boards\e3_324_ref_display\proj\jetour-t1n-fl3\sf\SES 编译&#xff1a;build->build sf 增加头文件和宏定义&#xff1a; 编译完成sf后&#xff0c;进行编译bootloader 东南项目&#xff1a;e3340\boa…

Java Server-Sent Events通信

Server-Sent Events特点与优势 后端可以向前端发送信息&#xff0c;类似于websocket&#xff0c;但是websocket是双向通信&#xff0c;但是sse为单向通信&#xff0c;服务器只能向客户端发送文本信息&#xff0c;效率比websocket高。 单向通信&#xff1a;SSE只支持服务器到客…

go语言(十四)----反射

变量的结构 2 举个例子 package mainimport "fmt"type Reader interface {ReadBook() }type Writer interface {WriteBook() }//具体类型 type Book struct {}func (this *Book) ReadBook() {fmt.Println("Read a Book")}func (this *Book) WriteBook() {…

​《WebKit 技术内幕》学习之九(3): JavaScript引擎

3 JavaScriptCore引擎 3.1 原理 JavaScriptCore引擎是WebKit中的默认JavaScript引擎&#xff0c;也是苹果在开源WebKit项目之后&#xff0c;开源的另外一个重要的项目。同其他很多引擎一样&#xff0c;在刚开始的时候它的主要部分是一个基于抽象语法树的解释器&#xff0c;这…

天软特色因子看板 (2024.1 第8期)

该因子看板跟踪天软特色因子A04001(当日趋势强度&#xff0c;该因子为反映股价走势趋势强弱&#xff0c;用以刻画股价走势趋势强弱&#xff0c;abs(值)越接近1&#xff0c;趋势 性越强&#xff0c;符号代表涨跌方向。 今日为该因子跟踪第8期&#xff0c;跟踪其在SW801080 (申万…

什么是WAF

WAF是Web应用防火墙&#xff08;Web Application Firewall&#xff09;的简称&#xff0c;是一款通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。 WAF主要用于防御Web应用攻击&#xff0c;例如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、网页…

Java--接口

文章目录 主要内容一.teacher&student1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 二.shape1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 三.生物、动物、人1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 总结 主要内容 一.teacher&stu…

开源项目CuteSqlite开发笔记(八):Windows 64位/32位使用GetWindowLongPtr钩子函数

需求描述 在开发CuteSqlite的时候&#xff0c; 有一个功能需要实现&#xff0c;鼠标移到WTL::CStatic上后&#xff0c;发送消息通知CToolTipCtrl弹出。 遇到问题 WTL::CStatic控件没有相应 WM_MOUSEMOVE 消息&#xff0c;需要返回一个HTCLIENT消息来让窗口处理函数执行 WM_MO…

web3:B站chainlink课程第五课Wsl安装ubuntu虚拟机

坑了我好久。 https://learn.microsoft.com/zh-cn/windows/wsl/install-manual 按照微软给的这个手动安装的方式来&#xff0c;别想在线了&#xff0c;反正来看这个的肯定是直接 wsl --install成功不了的选手。 注意&#xff01; 步骤6别从Microsoft Store 下载&#xff0c;…

C#winform上位机开发学习笔记9-串口助手的多窗体功能添加

1.功能描述 涉及子窗体的创建过程&#xff0c;子窗体的调用操作&#xff0c;子窗体与主窗体的显示位置设置&#xff0c;子窗体随主窗体移动 2.代码部分 步骤1&#xff1a;新建button并修改Text 步骤2&#xff1a;在现工程中新建项目 步骤3&#xff1a;选择窗体修改窗体名称 …

SCCB接口

文章目录 概述引脚传输时序起始/结束信号三线模式两线模式 传输周期3阶段写传输周期2阶段写传输周期2阶段读传输周期阶段一 ID Address阶段二 子地址/读数据阶段三 写数据 SCCB与IIC区别未完待续(还有代码&#xff09;... 概述 SCCB&#xff08;Serial Camera Control Bus&…

【极数系列】Flink 初相识(01)

# 【极数系列】Flink 初相识&#xff08;01&#xff09; 引言 Flink官网&#xff1a;https://flink.apache.org/ Flink版本&#xff1a;https://flink.apache.org/blog/ Flink文档&#xff1a;https://ci.apache.org/projects/flink/flink-docs-release-1.12/ Flink代码库…

Redis(五)管道

文章目录 官网总结Pipeline与原生批量命令对比Pipeline与事务对比使用Pipeline注意事项 官网 https://redis.io/docs/manual/pipelining/ Pipeline是为了解决RTT往返回时&#xff0c;仅仅是将命令打包一次性发送对整个Redis的执行不造成其它任何影响 总结 Pipeline与原生批量…

Med-YOLO:3D + 医学影像 + 检测框架

Med-YOLO&#xff1a;3D 医学影像 检测框架 提出背景设计思路网络设计训练设计讨论分析 魔改代码&#xff1a;加强小目标检测总结 提出背景 论文链接&#xff1a;https://arxiv.org/abs/2312.07729 代码链接&#xff1a;https://github.com/JDSobek/MedYOLO 提出背景&…

flutter设置windows是否显示标题栏和状态栏和全屏显示

想要让桌面软件实现全屏和不显示状态栏或者自定义状态栏&#xff0c;就可以使用window_manager这个依赖库&#xff0c;使用起来还是非常方便的&#xff0c;可以自定义显示窗口大小和位置&#xff0c;还有设置标题栏是否展示等内容&#xff0c;也可以设置可拖动区域。官方仓库地…

<C++>STL->list

list的介绍 list list是一个类模板&#xff0c;第一个模板参数为存储数据类型&#xff1b;第二个模板参数为空间适配器list是一个可以在常数时间内完成任意位置的插入和删除的顺序容器。list容器是以双链表的形式实现的&#xff1b;双链表可以将其包含的每个元素存储在不同且…