Linux -- 软硬链接

目录

软链接

什么是软链接?

怎么建立软链接?

文件的软链接

目录的软链接

如何删除链接?

硬链接

什么是硬链接?

怎么建立硬链接?

文件的硬链接

目录的硬链接

硬链接数

什么是硬链接数?


软链接

什么是软链接?

软链接(Symbolic Link),也称为符号链接或symlink,在计算机文件系统中是一种特殊类型的文件,它指向另一个文件或目录。软链接可以被看作是指向其他文件的一个快捷方式。与硬链接不同,软链接可以跨越不同的文件系统,并且可以指向目录

怎么建立软链接?

文件的软链接

命令ln -s 源文件名 软链接名就可以建立软链接。


可以发现,软链接的 inode 和 源文件的 inode 不一样, 说明软链接本质上就是一个独立的文件。软链接本身并不包含实际的文件内容。它只是一个特殊的文件,包含了指向另一个文件或目录的路径信息

目录的软链接

目录的软链接建立方式和文件一样。

如何删除链接?

命令unlink 软链接名就可以删除链接。硬链接也是一样的方法

硬链接

什么是硬链接?

硬链接(Hard Link)是操作系统中的一种文件系统特性,它允许多个文件名指向同一个文件的inode

怎么建立硬链接?

文件的硬链接

命令 ln 源文件 硬链接名 就可以建立硬链接。不带 -s !


查看硬链接的 inode 可以发现,硬链接的 inode 和 源文件的 inode 一样! 硬链接的本质不是一个独立的文件,硬链接与原始文件共享相同的 inode


这意味着如果你修改了通过硬链接访问的文件内容,那么这个修改也会反映到所有其他硬链接上,因为它们都指向相同的数据块。如下图,当我们重定向时,硬链接的文件大小也跟着改变。


只有当最后一个指向某个inode的硬链接被删除后,该文件的实际数据才会从磁盘上移除。在此之前,即使原始文件被删除,只要还有一个硬链接存在,文件数据就仍然可用

目录的硬链接

不允许用户对目录进行硬链接!

在文件系统中,如果允许对目录创建硬链接,可能会导致循环引用的问题。在文件系统的情境下,循环引用会导致遍历操作(如ls -R递归列出目录内容)进入无限循环。

让我们通过一个例子来说明为什么硬链接目录可能导致循环引用:

假设我们有以下目录结构,并且我们可以为目录创建硬链接:

bash 复制代码
/home/user/
├── dir1
│   └── file1
└── dir2
    └── file2

现在,如果我们能够创建硬链接,那么可以做如下操作:

  1. 创建一个从dir1dir2的硬链接:

    bash 复制代码
    ln /home/user/dir2 /home/user/dir1/link_to_dir2
  2. 然后,再创建一个从dir2dir1的硬链接:

    bash 复制代码
    ln /home/user/dir1 /home/user/dir2/link_to_dir1

此时,我们的目录结构变成了这样:

复制代码
/home/user/
├── dir1
│   ├── file1
│   └── link_to_dir2 -> /home/user/dir2
└── dir2
    ├── file2
    └── link_to_dir1 -> /home/user/dir1

在这个新的结构中,/home/user/dir1/link_to_dir2指向了 /home/user/dir2,而/home/user/dir2/link_to_dir1又指向了 /home/user/dir1。这就形成了一个循环引用:

  • dir1可以通过 link_to_dir2 到达 dir2
  • dir2可以通过 link_to_dir1 回到 dir1

当使用递归命令(如ls -R)来列出所有目录的内容时,程序会不断尝试从 dir1跳到 dir2,然后再从 dir2跳回 dir1,从而陷入无限循环

硬链接数

什么是硬链接数?

硬链接数是指向同一个inode的不同目录条目(文件名)的数量。

命令 ll 可以查看文件的硬链接数。在下图中,对文件建立硬链接后,文件的硬链接数从 1 变为 2,这是因为硬链接和源文件共享一个 inode。

新建的文件的默认硬链接数为 1 ,而新建目录的默认硬链接数为 2。

为什么新建目录的默认硬链接数是2?

这是因为每个目录下都有 . (当前目录)和 .. (父目录)这两个子目录,当前目录这是一个指向目录自身的硬链接当前目录和新建的目录都指向同一个 inode,所以新建目录的默认硬链接数为 2. 而 ..(父目录)使父目录的硬链接数加 1.

一个目录的硬链接数 -2 就可以得到该目录下有多少个子目录 。
当文件或目录的硬链接数减为 0 时,这个文件或目录才会被删掉!

相关推荐
aitav08 分钟前
⚡ arm 32位嵌入式 Linux 系统移植 NTP 服务
linux·arm开发·ntp
weixin_4569042713 分钟前
工业自动化通信控制
运维·struts·自动化
爱奥尼欧27 分钟前
【Linux笔记】网络部分——socket 编程 TCP实现多台虚拟机使用指令访问云服务器
linux·服务器·网络
yolo_guo32 分钟前
sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码
linux·c++·sqlite
m0”-“0m1 小时前
MySQL、Nignx和Docker在Linux上的安装详解
linux·数据库·mysql
野犬寒鸦1 小时前
从零起步学习Redis || 第十章:主从复制的实现流程与常见问题处理方案深层解析
java·服务器·数据库·redis·后端·缓存
luopandeng1 小时前
amd npt技术 对比 intel ept 技术
java·linux·网络
---学无止境---2 小时前
Linux中kmalloc内存分配函数的实现
linux
帅帅梓2 小时前
nginx访问控制 用户认证 https
运维·nginx·https
海底列车2 小时前
ubuntu-20.04.6升级OpenSSH_10.2p1
linux·服务器·ubuntu