在文件系统文件下,文件由 inode 表示(或者不确定是多个 inode)
文件系统中的文件基本上是指向索引节点的链接。
硬链接然后仅创建另一个文件,该文件具有指向相同基础 inode 的链接。
删除文件时,它会删除一个指向基础索引节点的链接。仅在删除到索引节点的所有链接后,才会删除索引节点(或删除 / 重写)。
符号链接是指向文件系统中另一个名称的链接。
一旦建立了硬链接,链接即指向 inode。删除重命名或移动原始文件不会影响该硬链接,因为它链接到基础索引节点。索引节点上数据的任何更改都会反映在引用该索引节点的所有文件中。
注意:硬链接仅在同一文件系统内有效。符号链接可以跨越文件系统,因为它们只是另一个文件的名称。
使用任何 Linux(ish)控制台都可能会有所帮助的一些不错的直觉。
创建两个文件:
$ touch foo; touch bar
在其中输入一些数据:
$ echo "Cat" > foo
$ echo "Dog" > bar
(实际上,我本来可以使用 echo,因为如果文件不存在,它会创建文件... 但是不要紧。)
和预期的一样:
$cat foo; cat bar
Cat
Dog
让我们创建硬链接和软链接:
$ ln foo foo-hard
$ ln -s bar bar-soft
让我们看看发生了什么:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
更改 foo 的名称无关紧要:
$ mv foo foo-new
$ cat foo-hard
Cat
foo-hard 指向文件的索引节点(即内容)- 未被更改。
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
找不到文件的内容,因为软链接指向已更改的名称,而不是内容。
同样,如果foo
被删除, foo-hard
仍持有的内容; 如果bar
被删除, bar-soft
仅仅是一个不存在的文件链接。
俗话说,一张图片值得一千个字。这是我的可视化方式:
这是我们获得该图片的方式:
在文件系统中创建一个名为myfile.txt
的名称,该名称指向一个新的索引节点(该索引节点包含文件的元数据,并指向包含其内容的数据块,即文本 “Hello,World!”:
$ echo 'Hello, World!' > myfile.txt
创建到文件myfile.txt
的硬链接my-hard-link
,这意味着 “创建一个文件,该文件应指向myfile.txt
指向的同一 inode”:
$ ln myfile.txt my-hard-link
创建一个指向文件myfile.txt
的软链接my-soft-link
,这意味着 “创建一个应指向文件myfile.txt
的文件”:
$ ln -s myfile.txt my-soft-link
看一下如果删除(或移动了) myfile.txt
将会发生什么: my-hard-link
仍指向相同的内容,因此不受影响,而my-soft-link
现在未指向任何内容。其他答案则讨论了每种方法的优缺点。