这里有很多非常正确的答案,但是我认为没有人真正解决过最初的误解。最初的问题基本上是“当我建立符号链接时,以后很容易识别它。但是我不知道如何识别硬链接。” 是的,答案基本上可以归结为“您不能”,或多或少地解释了原因,但似乎没有人承认这确实是令人困惑和奇怪的事情。
如果您正在阅读所有这些内容,并且已经弄清楚正在发生的事情,那么您就很好。您无需阅读我的内容。如果您仍然感到困惑,请继续。
真正简短的答案是,硬链接根本不是链接,完全不是符号链接。这是目录结构中的一个新条目,它指向原始目录条目所做的相同的一堆字节,一旦创建它,它与第一个条目一样“真实”且合法。驱动器上的每个 “普通”文件都至少具有一个硬链接。不,你不会看到它在任何目录,将无法引用或使用它。因此,如果您有一个文件Fred.txt,并且将Wilma.txt和Barney.txt硬链接到该文件,则这三个名称(和目录条目)都引用同一个文件,并且它们都同样有效。当您在文本编辑器中单击“保存”时,操作系统没有任何办法告诉其中一个条目是创建的,而其他条目是使用“ ln”命令创建的。
但是,操作系统确实必须跟踪指向同一文件的条目数。如果删除Wilma.txt,则不会释放驱动器上的任何空间也就不足为奇了。但是,如果删除Fred.txt(“原始”文件),则仍然不会释放驱动器上的任何空间,因为驱动器上的数据也被称为Fred.txt,但它仍然也是Barney.txt。仅当删除所有目录条目时,操作系统才会取消分配数据本身正在占用的空间。
如果Barney.txt是符号链接,则删除Fred.txt 将取消分配空间,而Barney.txt现在将是断开的链接。另外,如果您移动或重命名带有指向该文件的符号链接的文件,则会断开该链接。但是您可以随意移动或重命名硬链接的文件,而不会破坏指向该文件/数据的其他目录条目,因为所有这些目录条目都是引用驱动器上同一数据块的目录条目(通过使用该数据的inode号)。
[这是两年后,这最后一点困惑了我一分钟,所以我想我会澄清。如果键入“ mv ./Wilma.txt ../elsewhere/Betty.txt”,则似乎是在移动文件,但实际上并非如此。您真正要做的是从当前目录的目录列表中删除一个行项目,该行中显示“名称'Wilma.txt'与可以使用inode ######找到的数据相关联#”,然后在目录../elsewhere的目录列表中添加一个新行项目,其中显示“名称'Betty.txt'与可以通过inode #######找到的数据相关联”。这就是为什么只要将文件移动到同一驱动器上的另一个位置,就可以像移动2 KB文件一样快地“移动” 2 GB文件。
因为操作系统必须跟踪指向同一数据块的目录中有多少个不同的目录,所以即使您无法确定目录条目是否指向您,也可以确定是否已将特定文件硬链接到该文件。 '正在看的是'原始'的还是没有的。一种方法是“ ls”命令,特别是“ ls -l”(即破折号后的小写字母L)
借用先前的示例。
-rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f1
第一个字母是破折号,所以它不是目录或其他奇特的东西,而是一个“常规”普通文件。但是,如果它确实是普通的,则rwx-ish部分后面的数字将为“ 1”,例如,“有一个目录条目指向此数据块。” 但这是硬链接演示的一部分,因此改为显示“ 3”。
请注意,这可能会导致奇怪和神秘的行为(也就是说,如果您没有将头缠在硬链接上)。如果您在文本编辑器中打开Fred.txt并进行一些更改,您会在Wilma.txt和Barney.txt中看到相同的更改吗?也许。大概。如果您的文本编辑器通过打开原始文件并写入更改来保存更改,则可以,所有三个名称仍将指向相同(新更改)的文本。但是,如果您的文本编辑器创建了一个新文件(Fred-new-temp.txt),将更改后的版本写入该文件,然后删除Fred.txt,然后将Fred-new-temp.txt重命名为Fred.txt,Wilma和Barney将仍然指向原始版本,而不是新的更改版本。如果您不了解硬链接,则可能会使您有点生气。:) [好吧,实际上我个人并不知道可以执行新文件/重命名功能的文本编辑器,但是我确实知道许多其他程序可以做到这一点,因此请保持警惕。]
最后一点:“ fsck”(文件系统检查)检查的一件事是驱动器上是否存在某些目录条目不再引用的数据块。有时会出问题,指向索引节点的唯一目录条目会被删除,但驱动器空间本身不会被标记为“可用”。因此,fsck的工作之一是将所有分配的空间与所有目录条目进行匹配,以确保没有任何未引用的文件。如果找到某些目录,它将创建新的目录条目,并将其放入“丢失+找到”目录。