假设我有以下配置:
- 文件夹A
- 文件1
- 文件2
然后我创建文件夹 A 的软链接,如下所示:ln -s A B
这样我们现在就有了:
- 文件夹A
- 文件1
- 文件2
- 文件夹 B(文件夹 A 的符号链接(软链接))
- 文件1
- 文件2
现在,当我改变时B/file1
,这种改变就会传播到A/file1
。然而,看起来 - 当使用ls -l
in时B
- thatB/file1
和B/file2
是不是软链接到A/file1
和A/file2
!到底是怎么回事?
问题:这是真的吗?B/file1
硬链接到A/file1
?另一种问法是:当您软链接一个目录时,它的子文件是否会成为原始目录子文件的硬链接?有没有办法让一切都成为软链接?
答案1
它们不是硬链接有两个原因:
- 通过 ls 显示的软链接目录中文件的硬链接计数为 1。如果文件是硬链接,则计数将为 2 或更多。
- 硬链接不能跨越文件系统,而软链接可以。如果要创建硬链接,则无法跨文件系统软链接目录。
您真正看到的只是从不同路径访问同一目录的另一种方式。一旦您进入目录或对其中的文件进行操作,它们就是完全相同的文件(想象一下为房间添加一扇门,内容不会改变,但有一种新的进入方式)。
如果您希望目录的内容是软链接,那么您需要为目录中的每个文件而不是目录本身创建软链接,但这会使目录列表有点混乱。除了源和目标有不同的名称之外,我不确定您能从中获得什么优势。
答案2
看来你把事情搞混了。
符号链接:符号链接只是指向系统中另一个路径的指针。该路径可以存在或不存在,这并不重要,它也可以是绝对的或相对的。符号链接与目标文件无关,它只是指向。它甚至可以位于另一个物理磁盘上。它可以比作一个超级链接在网站上。
硬链接:硬链接是对文件的名称分配(确切地说是文件的索引节点号)。这种关系称为满射的。每个文件至少有一个引用其索引节点号的硬链接。索引节点号是对文件的引用。因此,现代文件系统没有文件名和实际文件的固定分配。
如果一个文件有 2 个硬链接引用其 inode,并且其中一个被删除(通过系统unlink()
调用),则仅删除该硬链接,文件和 inode 保持不变(这就是系统调用被命名为unlink()
not 的原因delete()
)。一旦硬链接的数量减少到零,索引节点最终就会被删除,文件也会被删除。
这就是理论。
当你改变时B/file1
,A/file1
它也会改变,因为它是相同的硬链接引用相同的索引节点号引用相同的文件。您只是浏览了A
指向目录的符号链接B
,而不是真正的目录B
。