【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 +0800
Birth: -
[!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]] -
删除软链接:我们可以使用
rm
或unlink
指令来删除链接文件
软链接的特性
- 软链接是一个独立的文件,有自己的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 不允许用户给目录创建硬链接,只能系统自己创建 (
.
和..
),这是因为给目录创建硬链接可能会在目录中引入循环,使得在目录遍历时系统陷入无限循环当中,从而导致无法定位到访问目录 (比如系统从根目录开始查找一个文件,当在查找过程中遇到根目录的硬链接时就会造成环路查找)。