【Linux】文件的软硬链接

文章目录

  • 一、文件和目录的一些命令
      • `ls` 命令
      • `stat` 命令
  • 二、链接的概念
  • 三、软链接(symbolic link)
      • 创建和删除软链接的示例
      • 软链接的特性
      • 软链接的应用
      • 使用 `find` 查找链接文件
  • 四、硬链接(hard link)
      • 创建和删除硬链接的示例
      • 硬链接的特性
      • 硬链接的应用

一、文件和目录的一些命令

ls 命令

在bash下执行:

ls -a -l -i

请添加图片描述

每一列的含义:请添加图片描述

因为加了-i选项,所以多了一列inode编号

中文解释英文解释
节点编号inode
文件权限Permissions
硬链接数量Hard Links
文件所有者Owner
文件所属组Group
文件大小Size
最后修改时间Last Modified
文件/目录名Name

stat 命令

使用 stat 查看文件的详细信息,包括 Inode 号码:

stat [FileName]

可以查到文件的ACM时间:Access、Modify、Change

  File: ‘log’Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d	Inode: 1054710     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    chen)   Gid: ( 1001/    chen)
Access: 2088-02-05 14:50:55.609459453 +0800
Modify: 2088-02-05 14:50:55.609459453 +0800
Change: 2088-02-05 14:50:55.609459453 +0800Birth: -

[!Abstract] 说明一下:

  • Access - 最后访问时间
  • Modify - 文件内容最后修改时间
  • Change - 属性最后修改时间


二、链接的概念

什么是链接?

  • 链接是文件系统中用于关联文件或目录的概念。

软链接和硬链接的区别

  • 软链接:也称为符号链接,类似于 Windows 快捷方式,可以跨文件系统。
  • 硬链接:指向相同 inode 的文件副本,不能跨文件系统。


三、软链接(symbolic link)

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件

创建和删除软链接的示例

  • 使用 ln -s 创建软链接:

    ln -s log log.soft.link
    

    请添加图片描述

    可以看到软连接 log.soft.link 有自己独立于 log 的inode编号

  • 和硬链接一样,软链接文件向文件中写入数据时原文件中也会存在该数据:
    请添加图片描述

  • 但是当原文件被删除后,再次查看软链接文件报错:
    ![[Pasted image 20240207192118.png]]

  • 删除软链接:我们可以使用 rmunlink 指令来删除链接文件

软链接的特性

  • 软链接是一个独立的文件,有自己的inode
  • 软连接存放内容是指向目标文件的路径
  • 软链接可以指向不存在的文件
  • 删除源文件会导致软链接失效

软链接的应用

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

请添加图片描述



使用 find 查找链接文件

在Linux下,可以使用 find 命令来查找软链接文件(symbolic links):

find /path/to/search -type l

其中,/path/to/search 是你要搜索的目标路径。上述命令会查找指定路径下的所有链接文件并输出它们的路径。

如果你想要在当前目录及其子目录中查找链接文件,可以使用:

find . -type l

如果你想要在整个系统中搜索链接文件,可以使用:

sudo find / -type l


四、硬链接(hard link)

创建和删除硬链接的示例

  • 演示如何使用 ln 创建硬链接,以及删除硬链接:
    ln hello hello.hard.link
    
    请添加图片描述

两个现象:

  • 创建硬链接会改变原文件的硬链接数 (文件权限后紧跟的数字代表文件的硬链接数)

  • 硬链接文件与原文件的文件属性完全相同,即硬链接文件与原文件使用同一个 inode

注:文件 inode 中存在一个类似于 count 的整形变量来记录文件的硬链接数,当我们为文件创建硬链接时 count 加1,删除原文件或者硬链接文件时 count 减1(C++中称为引用计数,Linux中称为文件的硬链接数),这也就是我们上面观察到文件的硬链接数发生变化的原因;所以,当一个文件的硬链接数变为0时,操作系统才会真正删除该文件,即执行将该文件的 inode bitmap 和 block bitmap 对应比特位置0等操作。



硬链接的特性

通过 [[文件系统 inode#5. inode Table(inode表)]] 的学习,我们了解到:真正找到磁盘上文件的并不是文件名,而是inode。 在Linux中可以让多个文件名对应于同一个inode,这就是硬链接。

  • 硬链接不是一个独立的文件,而是在指定目录内部的一组(inode,文件名)的映射关系。创建一个文件的硬链接时,新的目录项会被添加到原始文件所在的目录的目录项列表中。
  • 一个文件的所有硬链接指向相同的 inode
  • 删除任意一个硬链接不影响其他硬链接
  • 硬链接不能跨文件系统
  • 普通用户不能链接目录

当你在一个目录中创建文件时,实际上是在该目录的目录项列表中添加了一个新的目录项,该目录项包含了新文件的文件名和相应的inode号。通过inode号,系统可以快速找到文件的元数据(例如文件的权限、所有者、大小等信息)和文件的数据块。



硬链接的应用

Linux 中每个目录下都存在两个隐藏目录 ...,其中 . 代表当前目录,.. 代表上级目录:

请添加图片描述

  • 新建一个普通文件,其硬链接数是1,因为普通文件本身就有一个文件名与 inode 相对应
  • 新建一个目录时,目录的硬链接数为2,这是因为 Linux 中目录下存在隐藏的 .,它是目录的一个硬链接
  • 如果在当前目录下再新建一个下级目录,那么当前目录的硬链接数就会变为3,因为下级目录中的 .. 也是当前目录的一个硬链接。(这也是为什么 cd .. 能够回退到上级目录的原因,因为 .. 是上级目录的一个别名)

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

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

层层深入揭示C语言指针的底层机制

理解C语言指针的底层机制需要我们从硬件、操作系统和编译器三个层次逐步展开。 1. 硬件层次 计算机硬件是实现内存管理的基础。内存是一个由无数个存储单元组成的线性空间,每个存储单元都有一个唯一的地址。这个地址通常是一个二进制数,表示该存储单元…

飞马座卫星

1960年代马歇尔太空飞行中心的历史显然与建造土星五号月球火箭有关。然而,鲜为人知的是该中心在设计科学有效载荷方面的早期工作。 Fairchild 技术人员正在检查扩展的 Pegasus 流星体探测表面。Pegasus 由马里兰州黑格斯敦的 Fairchild Stratos Corporation 通过马歇…

【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】

文章目录 移位运算与乘法状态机简介SystemVerilog中的测试平台VCS 波形仿真 阻塞赋值和非阻塞赋值有限状态机(FSM)与无限状态机的区别 本篇文章接着上篇文章【芯片设计- RTL 数字逻辑设计入门 11 – 移位运算与乘法】 继续介绍,这里使用状态机…

电子电器架构 —— 网关测试脚本分析

电子电器架构 —— 网关测试 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何 消耗你的人和事,多看一眼都是你的不对。非…

27/100两数相除(位移todo)

题目 27/100两数相除 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 …

5G NR 频率计算

5G中引入了频率栅格的概念,也就是小区中心频点和SSB的频域位置不能随意配置,必须满足一定规律,主要目的是为了UE能快速的搜索小区;其中三个最重要的概念是Channel raster 、synchronization raster和pointA。 1、Channel raster …

C++初阶:容器(Containers)vector常用接口详解

介绍完了string类的相关内容后:C初阶:适合新手的手撕string类(模拟实现string类) 接下来进入新的篇章,容器vector介绍: 文章目录 1.vector的初步介绍2.vector的定义(constructor)3.v…

二进制安全虚拟机Protostar靶场(8)heap3 Fastbins unlink exploit

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 heap3 程序静态分析 https://exploit.education/protostar/heap-three/#include <stdlib.h> #include …

【Unity】重力场中的路径预测方法

前言 笔者前些天参加完了一场72小时的GameJam游戏开发比赛。这次比赛的主题是“探索”&#xff0c;笔者做了一个名为《探索者号》的探索宇宙的游戏&#xff08;游戏名一开始叫做《星际拾荒者》&#xff0c;但这不重要&#xff09;。 在开发过程中&#xff0c;笔者遇到了一些问…

高可用 k8s 1.29 一键安装脚本, 丝滑至极

博客原文 文章目录 集群配置配置清单集群规划集群网络规划 环境初始化主机配置 配置高可用ApiServer安装 nginx安装 Keepalived 安装脚本需要魔法的脚本不需要魔法的脚本配置自动补全加入其余节点 验证集群 集群配置 配置清单 OS&#xff1a; ubuntu 20.04kubernetes&#xf…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第10章 项目进度管理(三)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

流量嗅探详解

不少人存在这样的观点&#xff1a;只要计算机安装各种专业的安全软件&#xff0c;系统及时更 新补丁&#xff0c;密码尽可能复杂&#xff0c;那么计算机就会避免遭到入侵。当然这样的确不容易 被入侵&#xff0c;但那也只是针对传统的病毒、木马而言&#xff0c;在流量攻击面前…

汇编笔记 01

小蒟蒻的汇编自学笔记&#xff0c;如有错误&#xff0c;望不吝赐教 文章目录 笔记编辑器&#xff0c;启动&#xff01;debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器&#xff0c;启动&#xff01; 进入 debug 模式 debug功能 …

在C++的union中使用std::string(非POD对象)的陷阱

struct和union的对比 union最开始是C语言中的关键字&#xff0c;在嵌入式中比较常见&#xff0c;由于嵌入式内存比较稀缺&#xff0c;所以常用union用来节约空间&#xff0c;在其他需要节省内存的地方也可以用到这个关键字&#xff0c;写一个简单程序来说明union的用途 struc…

如何合理规划 PostgreSQL 的数据库用户

PostgreSQL 作为世界上最领先的开源数据库&#xff0c;有一套强大的用户角色权限系统&#xff0c;和 MySQL 做一个对比&#xff1a; 但硬币的另一面则是对于简单场景来说增加了复杂度。在许多单应用场景&#xff0c;其实也不需要额外的 schema 层&#xff0c;也不需要额外的 ow…

2 月 7 日算法练习- 数据结构-树状数组上二分

问题引入 给出三种操作&#xff0c; 0在容器中插入一个数。 1在容器中删除一个数。 2求出容器中大于a的第k大元素。 树状数组的特点就是对点更新&#xff0c;成段求和&#xff0c;而且常数非常小。原始的树状数组只有两种操作&#xff0c;在某点插入一个数和求1到i的所有数的…

Sublime Text 3配置 Node.js 开发环境

《开发工具系列》 Sublime Text 3配置 Node.js 开发环境 一、引言二、主要内容2.1 初识 Sublime Text 32.2 初识 Node.js2.3 接入 Node.js2.3.1 下载并安装 Node.js2.3.2 环境变量配置 2.4 配置 Node.js 开发环境2.5 编写 Node.js 代码2.6 运行 Node.js 代码 三、总结 一、引言…

Spring Boot3整合Redis

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 1.导依赖 2.配置连接信息以及连接池参数 3.配置序列化方式 4.编写测试 前置条件 已经初始化好一个spr…

C++,stl,deque容器详解

目录 1.deque容器的构造函数 代码示例&#xff1a; 2.deque的赋值操作 3.deque的大小操作 4.deque的插入和删除 5.deque的数据存取 6.deque的排序操作 1.deque容器的构造函数 代码示例&#xff1a; #include<bits/stdc.h> using namespace std;void print(deque…

Spring Cloud使用ZooKeeper作为注册中心的示例

简单的Spring Cloud应用程序使用ZooKeeper作为注册中心的示例&#xff1a; 1.新建模块&#xff1a; 2.勾选依赖&#xff1a; 3.在pom.xml文件中做出部分修改及添加Spring Cloud Zookeeper 依赖版本&#xff1a; 完整pom文件 <?xml version"1.0" encoding&q…