目录
软链接
什么是软链接?
怎么建立软链接?
文件的软链接
目录的软链接
如何删除链接?
硬链接
什么是硬链接?
怎么建立硬链接?
文件的硬链接
目录的硬链接
硬链接数
什么是硬链接数?
软链接
什么是软链接?
软链接(Symbolic Link),也称为符号链接或symlink,在计算机文件系统中是一种特殊类型的文件,它指向另一个文件或目录。软链接可以被看作是指向其他文件的一个快捷方式。与硬链接不同,软链接可以跨越不同的文件系统,并且可以指向目录。
怎么建立软链接?
文件的软链接
命令 ln -s 源文件名 软链接名 就可以建立软链接。
可以发现,软链接的 inode 和 源文件的 inode 不一样, 说明软链接本质上就是一个独立的文件。软链接本身并不包含实际的文件内容。它只是一个特殊的文件,包含了指向另一个文件或目录的路径信息。
目录的软链接
目录的软链接建立方式和文件一样。
如何删除链接?
命令 unlink 软链接名 就可以删除链接。硬链接也是一样的方法。
硬链接
什么是硬链接?
硬链接(Hard Link)是操作系统中的一种文件系统特性,它允许多个文件名指向同一个文件的inode。
怎么建立硬链接?
文件的硬链接
命令 ln 源文件 硬链接名 就可以建立硬链接。不带 -s !
查看硬链接的 inode 可以发现,硬链接的 inode 和 源文件的 inode 一样! 硬链接的本质不是一个独立的文件,硬链接与原始文件共享相同的 inode 。
这意味着如果你修改了通过硬链接访问的文件内容,那么这个修改也会反映到所有其他硬链接上,因为它们都指向相同的数据块。如下图,当我们重定向时,硬链接的文件大小也跟着改变。
只有当最后一个指向某个inode的硬链接被删除后,该文件的实际数据才会从磁盘上移除。在此之前,即使原始文件被删除,只要还有一个硬链接存在,文件数据就仍然可用。
目录的硬链接
不允许用户对目录进行硬链接!
在文件系统中,如果允许对目录创建硬链接,可能会导致循环引用的问题。在文件系统的情境下,循环引用会导致遍历操作(如ls -R
递归列出目录内容)进入无限循环。
让我们通过一个例子来说明为什么硬链接目录可能导致循环引用:
假设我们有以下目录结构,并且我们可以为目录创建硬链接:
/home/user/
├── dir1
│ └── file1
└── dir2
└── file2
现在,如果我们能够创建硬链接,那么可以做如下操作:
-
创建一个从
dir1
到dir2
的硬链接:ln /home/user/dir2 /home/user/dir1/link_to_dir2
-
然后,再创建一个从
dir2
到dir1
的硬链接: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 时,这个文件或目录才会被删掉!