Linux 系统中的软链接与硬链接

news/2025/2/24 4:03:35

目录

一、什么是软链接

1. 创建软链接

2. 软链接的特性

3. 软链接的用途

二、什么是硬链接

1. 创建硬链接

2. 硬链接的特性

3. 硬链接的用途

4. 目录硬链接的特殊性

​编辑

三、软链接硬链接的区别

1. inode 编号

2. 路径依赖

3. 删除行为

四、实际操作演示

1. 创建和删除软链接

2. 创建和删除硬链接

3. 软链接硬链接的对比

五、深度对比分析


一、什么是软链接

        软链接(Symbolic Link)也称为符号链接,类似于 Windows 系统中的快捷方式。它是一个独立的文件,其内容是指向目标文件或目录的路径。通过软链接,我们可以在不同的位置访问同一个文件或目录,而无需复制文件。

1. 创建软链接

创建软链接的命令是 ln -s,其中 -s 表示创建符号链接。语法如下:

ln -s <目标文件或目录> <软链接名称>

示例:

假设我们有一个文件 file_target1.txt,我们想为它创建一个软链接 file_soft.link

touch file_target1.txt  # 创建目标文件
ln -s file_target1.txt file_soft.link  # 创建软链接
ll  # 查看文件列表

输出结果:

从输出中可以看到,file_soft.link 是一个符号链接,指向 file_target1.txt

2. 软链接的特性

  • 独立性软链接是一个独立的文件,具有自己的 inode 编号。

  • 路径依赖软链接依赖于目标文件的路径。如果目标文件被移动或删除,软链接将失效。

示例:

删除目标文件后,软链接将失效。

rm file_target1.txt  # 删除目标文件
ll  # 查看文件列表

输出结果:

可以看到,file_soft.link 仍然存在,但它已经失效,因为目标文件 file_target1.txt 被删除了。

3. 软链接的用途

  • 路径重定向:将文件或目录的访问路径重定向到另一个位置。

  • 简化路径:通过软链接简化复杂路径,方便访问。

  • 文件共享:在不同目录中共享同一个文件。

二、什么是硬链接

        硬链接(Hard Link)是指多个文件名指向同一个 inode(索引节点)。硬链接不是独立的文件,它与目标文件共享同一个 inode,因此它们实际上是同一个文件的不同入口。

1. 创建硬链接

创建硬链接的命令是 ln,语法如下:

ln <目标文件> <硬链接名称>

示例:

假设我们有一个文件 file_target2.txt,我们想为它创建一个硬链接 file_hard.link

touch file_target2.txt  # 创建目标文件
ln file_target2.txt file_hard.link  # 创建硬链接
ll  # 查看文件列表

输出结果

从输出中可以看到,file_hard.linkfile_target2.txt硬链接数都是 2,这表明它们共享同一个 inode。

2. 硬链接的特性

  • 共享 inode硬链接与目标文件共享同一个 inode,因此它们实际上是同一个文件。

  • 路径独立硬链接不依赖于目标文件的路径,即使目标文件被重命名或移动,硬链接仍然有效。

  • 删除行为:删除一个硬链接不会影响其他硬链接或目标文件,只有当所有硬链接都被删除时,文件才会被真正删除。

示例:

删除一个硬链接,目标文件仍然存在。

rm file_hard.link  # 删除硬链接
ll  # 查看文件列表

输出结果

可以看到,file_target2.txt 仍然存在,只是硬链接数减少到 1。

3. 硬链接的用途

  • 文件备份:通过硬链接创建文件的备份,节省磁盘空间。

  • 文件共享:在不同目录中共享同一个文件。

  • 系统文件管理:用于系统文件的冗余备份和管理。

4. 目录硬链接的特殊性

目录结构解析:

  • . 代表当前目录

  • .. 代表父目录

  • 每个子目录的..都会增加父目录的链接计数

系统限制的意义:

禁止用户创建目录硬链接是为了防止出现循环引用,避免文件系统陷入死循环。

三、软链接硬链接的区别

1. inode 编号

  • 软链接:具有独立的 inode 编号。

  • 硬链接:与目标文件共享同一个 inode 编号。

示例:

ll -i  # 查看 inode 编号

输出结果

可以看到,file_soft.link 有独立的 inode 编号(527771),而 file_hard.linkfile_target2.txt 共享同一个 inode 编号(527769)。

2. 路径依赖

  • 软链接:依赖于目标文件的路径,路径改变会导致软链接失效。

  • 硬链接:不依赖于目标文件的路径,即使目标文件被重命名或移动,硬链接仍然有效。

示例:

移动目标文件后,软链接失效,硬链接仍然有效。

mv file_target2.txt /home/lv/  # 移动目标文件
ll  # 查看文件列表

输出结果

可以看到,file_soft.link 已经失效,而 file_hard.link 仍然有效。

3. 删除行为

示例:

删除目标文件后,硬链接仍然有效。

rm file_target2.txt  # 删除目标文件
ll  # 查看文件列表

输出结果

可以看到,file_hard.link 仍然存在,因为它是硬链接

四、实际操作演示

1. 创建和删除软链接

2. 创建和删除硬链接

3. 软链接硬链接的对比

五、深度对比分析

特性软链接硬链接
存储内容目标路径直接指向inode
inode编号独立与源文件相同
跨文件系统✔️
目录支持✔️❌(系统目录除外)
文件删除影响链接失效减少链接计数
文件大小路径字符长度与源文件相同
权限显示显示lrwxrwxrwx与源文件相同

http://www.niftyadmin.cn/n/5863957.html

相关文章

安卓好软-----车机端 安卓tv端很好用的应用管家 adb 授权等等功能

应用管家是一款完全免费且实用的安卓平台系统管理工具&#xff0c;专为管理电视、车机的应用及文件而设计。其支持提取/卸载禁用自带应用、传送安装、清理及本地文件查找编辑压缩等等功能。 众所周知&#xff0c;当前市面上大多数厂家智能电视系统均基于谷歌原生安卓进行了“深…

go channel 的用法和核心原理、使用场景

一、Channel 的核心用法 1. 基本操作 // 创建无缓冲 Channel&#xff08;同步通信&#xff09; ch : make(chan int) // 创建有缓冲 Channel&#xff08;容量为5&#xff0c;异步通信&#xff09; bufferedCh : make(chan int, 5) // 发送数据到 Channel ch <- 42 // 从…

(前端基础)CSS(一)

了解 Cascading Style Sheet&#xff1a;层叠级联样式表 CSS&#xff1a;表现层&#xff08;美化网页&#xff09;如&#xff1a;字体、颜色、边框、高度、宽度、背景图片、网页定位、网页浮动 css优势&#xff1a; 内容和表现分离网页结构表现统一&#xff0c;可以实现复用…

`AdminAdminDTO` 和 `userSession` 对象中的字段对应起来的表格

以下是将更正后的表格放在最前面的回答&#xff0c;表格包含序号列&#xff0c;合并了后端 AdminAdminDTO 和前端 userSession 的所有字段&#xff0c;并标注对方没有的字段。token 字段值用省略号&#xff08;...&#xff09;表示&#xff1a; 序号字段名AdminAdminDTO (后端…

抽象类、接口、枚举

一、抽象类 1.1 简介 作为父类&#xff0c;里面的方法逻辑不能满足任何一个子类的需求&#xff0c;提供的逻辑根本就用不上&#xff0c;那么就不添加方法体了&#xff0c;此时这个方法需要 使用关键字abstract来修饰&#xff0c;表示为抽象方法&#xff0c;而抽象方法所在的类…

Deepseek reasoning-content 透出调研

Deepseek reasoning-content 透出调研 部署方式&#xff1a;Docker Ollama Deepseek-R1:8b 参考&#xff1a; https://help.apiyi.com/deepseek-reasoning-content-guide.htmlhttps://yuluo-yx.github.io/blog/%E4%BD%BF%E7%94%A8-Ollama-%E9%83%A8%E7%BD%B2-DeepSeek-%E5…

【消息队列】认识项目

1. 项目介绍 该项目是去实现一个简单的消息队列&#xff0c;包含服务器&#xff0c;客户端的实现&#xff0c;客户端通过远程方法调用与服务器进行交互。采用自定义应用层协议&#xff0c;下层使用 TCP 协议进行数据在网络中传输&#xff0c;核心功能提供了虚拟主机&#xff0…

[数据结构]栈详解

目录 一、栈的概念及其结构 二、栈的实现 1.栈的初始化 void STInit(ST* ps); 2.栈的插入 void STPush(ST* ps, STDataType x); 3.栈的删除 void STPop(ST* ps); 4.栈的大小计算 int STSize(ST* ps); 5.判断栈是否为空 bool STEmpty(ST* ps); 6.栈的销毁 void STDestro…