细谈linux软硬链接

文章目录

  • Ⅰ. 软链接
  • Ⅱ. 硬链接
    • 1、硬链接
    • 2、硬链接数
  • Ⅲ. 软硬链接的区别
  • Ⅳ. 软硬链接的应用
    • 1、软链接的应用
    • 2、硬链接的应用
    • 3、硬链接创建规定

Ⅰ. 软链接

​ 在讲这些链接之前,我们都会先讲如何创建它们!

​ 对于软连接,在 linux 中,我们可以使用 ln (link)指令带上 -s 选项来生成一个指定文件的软链接!

​ 也就是说创建软链接的指令为:ln -s 指定文件 要创建的软链接名称 (注意软链接的名称是可以随便起的,但是为了可辨识度高,一般前缀为sort,后缀为 .link

# 我们为log.txt创建一个软链接
[liren@VM-8-2-centos fileSystem]$ ln -s log.txt soft_log.link
[liren@VM-8-2-centos fileSystem]$ ls -li
1314728 -rw-rw-r-- 1 liren liren  0 Feb  2 15:39 log.txt
1314729 lrwxrwxrwx 1 liren liren  7 Feb  2 15:40 soft_log.link -> log.txt

​ 我们通过 ls -li 指令也可以看到这是我们第一次接触到文件类型为 l(link)的文件,并且可以看到 sort_log.linklog.txtinode 是不同的,除此之外硬链接数量也没有变化,具体的可以看下图,硬链接数量后面会讲!

软链接文件是一个独立的文件,有自己的 inode 属性和数据块。数据块中存储的是软链接指向目标文件的路径和文件名,通过保存的路径访问源文件,因此源文件被删除则无法再访问,通过路径将找不到源文件,这时候软链接就会失效。

​ 软链接类似 windows 中的快捷方式,快捷方式怎么用软链接就怎么用。比如桌面看到的软件保存的是其它的路径,在系统中可能你要运行的可执行程序在一个很深的目录下,就可以在较上层的目录中建立软链接来直接使用。

所以我们可以总结一下软链接(也称为 符号链接)的特点:

  • 软链接文件的文件类型为 ‘l’ (link的第一个字母),即链接文件!
  • 软链接并不会改变原文件的硬链接数
  • 软链接拥有自己独立的 inode,是一个全新的文件,所以软链接文件的文件属性和原文件并不相同!
  • 软链接中保存的是源文件路径和自己的属性内容!

​ 如果想删掉软链接,可以通过 rm 指令删掉,但是我们更推荐下面这种做法:

unlink sort_log.link #删除软链接

Ⅱ. 硬链接

1、硬链接

​ 想要创建一个硬链接,和软链接差不多,只需要去掉 -s 选项即可!

​ 也就是说创建硬链接的指令为:ln 指定的文件 硬链接的名称 (一般我们习惯**硬链接的名称以 hard 开头,以 .link 结尾**)

# 我们为log.txt创建一个硬链接
[liren@VM-8-2-centos fileSystem]$ ln log.txt hard_log.link

​ 我们可以看到,硬链接的 inode 编号居然和源文件是一样的,也就是说硬链接其实不是一个全新的文件,只是当前目录多添加了一个 hard_log.link 对应的 inode 编号和文件名映射而已!除此之外这个硬链接数我们还没介绍,下面先来看看它们分别对应的内容:

​ 符合我们的预期,因为硬链接本质上和源文件指向的都是同一个文件!下面我们尝试来删掉文件:

​ 可以清楚看到删除源文件之后,硬链接的 inode 编号还是原来的那个,并且硬链接数从 2 变成了 1,甚至我们来查看一下软硬链接它们分别的内容:

​ 可以发现硬链接依然能够看到文件的内容,但是软链接已经失效了,因为软链接中存放的是原来源文件的路径,现在源文件没了,当然就找不到了,也可以侧面说明源文件和硬链接文件的路径是不同的

​ 至于如何删除硬链接,这和删除软链接是一样的,都可以通过 rmunlink 指令来删除:

[liren@VM-8-2-centos fileSystem]$ unlink hard_log.link  #删除硬链接
[liren@VM-8-2-centos fileSystem]$ ll
total 0
lrwxrwxrwx 1 liren liren 7 Feb  2 15:40 soft_log.link -> log.txt
[liren@VM-8-2-centos fileSystem]$ 

​ 所以现在我们就可以来解释硬连接数是什么了!

2、硬链接数

​ 通过上面我们也能观察到,硬链接和源文件的关系本质上类似于 C++ 中的引用,并且利用了**引用计数**的概念,也就是说,创建一个硬链接其实就是多了一个指向源文件的一个引用,对于目录来说,只会多添加了一个 inode 和文件名的映射关系而已,我们可以看下图,更好的理解这个关系:

​

​ 这也就是为什么我们把源文件删掉了之后,我们还是能查看 hard_log.link 的内容,其实就是被指向文件还没有被删掉,只有当这个文件没有被任何 inode 指向,也就是硬链接数 count == 0 ,该文件才会被回收释放!

​ 所以其实软链接中如果源文件被删了,但是其实软链接指向的源文件的指向文件其实有可能还是存在其它文件指向它的,不一定就是被删了!

Ⅲ. 软硬链接的区别

1、软链接会生成独立的 inode硬链接与源文件 inode 相同

2、软链接只保存源文件的路径,硬链接则是一个源文件的 “文件别名”

3、源文件删除之后,软链接失效,而硬链接依然有用

4、只有硬链接才影响源文件的硬链接数

Ⅳ. 软硬链接的应用

1、软链接的应用

​ 软链接最常见的作用之一就是作为快捷方式使用,如下:log.txt 程序在很深的路径下,以至于我们每次运行它都很不方便,此时我们就可以为它建立一个软链接。

2、硬链接的应用

​ 硬链接的应用其实就涉及到了我们目录等文件底层了,我们先来创建一个普通文件:

​ 可以看到普通文件的硬链接数是 1,这个不难理解,因为 log.txt 本身就是一个 inode 和文件名的映射,所以硬链接数才为 1。接下来我们创建一个目录看看:

​ 咦是不是很奇怪,为什么目录的硬连接数是 2 呢,如果说目录文件名本身和它的 inode 有映射,那顶多就只有一个硬链接数啊,为什么会有两个啊 ❓❓❓

​ 其实是这样子的,还记得我们常见目录的时候,目录里面会默认存在两个目录文件吗,分别是 ... ,有人可能会问这也是文件吗,那肯定啊,谁规定说文件名一定得是英文字母呢!

​ 所以我们到 file 目录下面看一看:

​ 平时我们一直使用 cd .. 等指令,为什么能到达上级目录,其实就是因为这个 .. 文件就是指向上级目录的(其实就是一个上级目录的别名)。当我们创建一个目录的时候,目录里面默认放的这两个文件,其中 . 就指向 file 这个当前目录,所以也就是说硬链接数为 2 就是来自于 .file 本身。

​ 那我们看到 file 目录下还有一个 .. 文件,为什么它的硬链接数是 3 呢 ❓❓❓

​ 其实很好理解,配合下图来解释,我们在 file 目录下存在一个 .. 文件,表示的是 file 的上级目录也就是 fileSystem,而 fileSystem 中又存在一个 . 文件,另外再加上 fileSystem 目录的本身,一共就是 3 个,所以硬链接数就是 3

​ 总结一下就是硬链接的应用非常的重要,它为我们提供了在目录和目录之间的快速切换!

3、硬链接创建规定

​ 注意在 Linux 不允许用户给目录创建硬链接,只能系统自己创建 ... ,这是因为给目录创建硬链接可能会在目录中引入循环,使得在目录遍历时系统陷入无限循环当中,从而导致无法定位到访问目录(比如系统从根目录开始查找一个文件,当在查找过程中遇到根目录的硬链接时就会造成环路查找)。

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

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

相关文章

python matplotlib 图片显示中文

在Linux 环境中,使用matplotlib 显示中文时,总是提示: /python/stock.py:273: UserWarning: Glyph 33647 (\N{CJK UNIFIED IDEOGRAPH-836F}) missing from current font. fig.savefig(self.name ".jpg", bbox_inches tight) …

【数据结构】插入排序 (直接插入排序 希尔排序)

文章目录直接插入排序希尔排序直接插入排序 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 如果tmp比end的数大或者相等,就继续放在end后面。 如果比end的数小&…

Elasticsearch基本安全加上安全的 HTTPS 流量

基本安全加上安全的 HTTPS 流量 在生产环境中,除非您在 HTTP 层启用 TLS,否则某些 Elasticsearch 功能(例如令牌和 API 密钥)将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…

初始React

一.React的诞生1.什么是React?React是一个讲数据渲染为HTML视图的来源Js库,用于构建用户界面的JS库。在以前的学习中构建用户界面的常用操作步骤:发送请求获取数据处理数据(过滤,整理格式等)操作DOM呈现页面2.React诞…

《SpringBoot》第02章 自动配置机制(一) 项目启动

前言 关于SpringBoot,最大的特点就是开箱即用,通过自动配置机制,遵守约定大于配置这个准则,那么这个是如何实现的呢? 本章首先会介绍SpringBoot的启动执行 一、启动第一步:初始化 1.本章概述 当启动Sp…

【论文精读(李沐老师)】Attention Is All You Need

Abstract 在主流的序列转录(给你一个序列,生成另外一个序列)模型中主要是依赖复杂的RNN和CNN,一般包括encoder和decoder两个结构。在性能最好的模型里,通常使用注意力机制连接encoder和decoder。 (本文想做…

HTTP API接口设计规范

1. 所有请求使用POST方法 使用post,相对于get的query string,可以支持复杂类型的请求参数。例如日常项目中碰到get请求参数为数组类型的情况。 便于对请求和响应统一做签名、加密、日志等处理 2. URL规则 URL中只能含有英文,使用英文单词或…

爱玩飞飞加速实现与分析

一步一步找数据。然后根据游戏数据找游戏基址,游戏基址可以遍历所有数据。想学的可以看看。第一步找基础数据,我们用的ce7.1.当然你们也可以用其他版本。网上随便下一个就行。 第一步。打开ce7.1附加游戏进程。 然后看下自己的血量是多少。我们这里是5…

HTML5支持的视频文件格式和音频文件格式有哪些?

在 HTML5 标准中, 我们有了新的 和 标签, 分别可以引入视频和音频文件的标签 那么这些标签又可以支持哪些文件格式呢 ? 格式支持 视频文件格式 MP4:MPEG-4 Part 14,支持H.264编码。几乎所有的浏览器都支持该格式。 WebM:谷歌开发的格式&a…

【最短路算法】第三弹:一文学懂spfa 算法(队列优化的Bellman-Ford算法)

博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 算法 ;该专栏专注于蓝桥杯和ACM等算法竞赛🔥近期目标&…

Java Script

一.初识js 1.与css html的关系 HTML 网页的结构(骨CSS:网页的表现(皮JavaScript :网页的行为2.运行过程 编写的代码是保存在文件上,也就是存储到硬盘(外存zhong)双击以后,html文件浏览器(引用程序)就会读取文件,将文件内容加载到内存中,(数据流向:硬盘->内存)浏览器会解析用…

Linux——基本指令

目录 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令(重要) 06.rmdir指令 && rm 指令(重要) 07.man指令(重要) 08.cp指令(重要) 09.mv指令&…

react使用craco.config.js完成rem移动端适配(sass)

环境: "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.8.2", "sass": "^1.58.3", yarn add craco/craco postcss-pxtorem lib-flexible 1、创建 craco.…

Java入门知识(超详细讲解)

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:老茶icon 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,计…

REDIS19_zipList压缩列表详解、快递列表 - QuickList、跳表 - SkipList

文章目录①. 压缩列表 - zipList②. 快递列表 - QuickList③. 跳表 - SkipList①. 压缩列表 - zipList ①. ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1) (oxff:11111111) type…

BI界的ChatGPT,它有什么厉害之处

​ChatGPT火了,注册用户从0到1亿,仅用了2个月时间。ChatGPT的背后是大数据、大模型、大算力,是AI的能力集中化的典型场景。那么在BI界,是否也有一款像ChatGPT一样智能BI软件,只要告诉它我们想看啥数据,它噔…

使用 Jpom 自动构建和部署项目

比 Jenkins 简单的项目构建和部署工具。 前端项目自动构建部署 我有几个自用的前端项目,每次修改代码后都需要本地打包再上传到服务器进行部署,感觉有点麻烦,不够自动化,所以一直想找个能够实现自动构建和部署的工具。 这时候可…

智能灯泡灯一Homekit智能家居

传统的灯泡是通过手动打开和关闭开关来工作。有时,它们可以通过声控、触控、红外等方式进行控制,或者带有调光开关,让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块,可与手机、家庭智能助手、或其他智能硬件进行通信&#…

Camtasia Studio2023非常好用的电脑录屏软件

如果你需要制作视频教程、游戏直播或其他视频内容,那么一个好的录屏软件就是必不可少的。Camtasia Studio是非常好用的录屏软件,它们可以记录计算机屏幕上发生的所有活动,并可捕捉声音。这些软件还提供了一些视频编辑功能,如裁剪、…

【Python学习笔记(七)】queue队列模块的使用

queue队列模块的使用 前言 为了解决多线程之间共享数据的问题,需要对线程进行加锁或者是线程等待; 更简单的解决这一问题,就需要引入队列的概念: 队列是一种特殊的线性表,是一种先进先出 (FIFO) 的数据结构&#xff…