Unix/Linux 中的软链接和硬链接
UNIX 中的链接是指向文件的指针。与任何编程语言中的指针一样,UNIX 中的链接是指向文件或目录的指针。创建链接是一种访问文件的快捷方式。链接允许多个文件名在别处引用同一个文件。
有两种类型的链接:
- 软链接或符号链接
- 硬链接
当链接的源(链接到的内容)被移动或移除时,这些链接的行为会有所不同。符号链接不会更新(它们只包含一个字符串,它是其目标的路径名);硬链接始终指向源,即使移动或删除。
例如,如果我们有一个文件 a.txt。如果我们创建文件的硬链接然后删除文件,我们仍然可以使用硬链接访问文件。但是如果我们创建文件的软链接,然后删除文件,就不能通过软链接访问文件,软链接就变成悬空了。基本上硬链接增加了一个位置的引用计数,而软链接作为快捷方式(如在 Windows 中)
1.硬链接
- 每个硬链接文件都分配了与原始文件相同的 Inode 值,因此它们引用相同的物理文件位置。即使原始或链接的文件在整个文件系统中移动,硬链接也更灵活并保持链接,尽管硬链接无法跨越不同的文件系统。
- ls -l 命令显示所有链接,链接列显示链接数。
- 链接有实际的文件内容
- 删除任何链接,只会减少链接数,但不会影响其他链接。
- 即使我们更改了原始文件的文件名,硬链接也能正常工作。
- 我们不能为目录创建硬链接以避免递归循环。
- 如果原始文件被删除,则链接仍将显示文件的内容。
- 任何硬链接文件的大小与原始文件相同,如果我们更改任何硬链接中的内容,则所有硬链接文件的大小都会更新。
- 硬链接的缺点是不能为不同文件系统上的文件创建,也不能为特殊文件或目录创建。
- 创建硬链接的命令是:
$ ln [original filename] [link name]
2. 软链接
- 软链接类似于 Windows 操作系统中使用的文件快捷方式功能。每个软链接文件都包含一个指向原始文件的单独 Inode 值。与硬链接类似,对任一文件中数据的任何更改都会反映在另一个文件中。软链接可以跨不同的文件系统链接,但如果原始文件被删除或移动,软链接文件将无法正常工作(称为挂链接)。
- ls -l 命令显示第一列值为 l 的所有链接?并且链接指向原始文件。
- 软链接包含原始文件的路径而不是内容。
- 删除软链接除了删除原始文件没有任何影响,链接变成“悬空”链接,指向不存在的文件。
- 软链接可以链接到目录。
- 软链接的大小等于创建软链接的文件名。例如,如果文件名是file1,那么它的软链接的大小将是5 个字节,这等于原始文件名的大小。
- 如果我们更改原始文件的名称,那么该文件的所有软链接都会变得悬而未决,即它们现在一文不值。
- 跨文件系统链接:如果要跨文件系统链接文件,只能使用符号链接/软链接。
- 创建软链接的命令是:
$ ln -s [original filename] [link name]