一个硬链接能指向一个已删除的文件吗?

3

我了解Linux中硬链接和软链接的区别,但我不太理解一个问题:硬链接是否可以指向已删除的文件?为什么?我认为它是可以的,但不确定。希望能给出解释。谢谢!


6
当一个文件的硬链接计数为0时,该文件被视为已删除。 - Trash Can
1
解释比索引节点更简单和基础。不要问关于已删除文件的问题,认识到真相:不存在“删除”操作。你所想象的“删除”操作的正式名称实际上是unlink - Ben Voigt
3个回答

16

考虑一个例子,

 $ touch aFile.txt
 $ ls -i aFile.txt  # -i is the option to look at the inode of a file
 2621520 aFile.txt

 $ ln aFile.txt 2File.txt # Hardlink the file to another one
 $ ls -i 2File.txt
 2621520 2File.txt  # inode is pointing to the same location

 $ rm aFile.txt  # Original file gets deleted
 $ ls 2File.txt
 2File.txt

 $ ls -i 2File.txt # inode survives and still pointing to the same location
 2621520 2File.txt

在此阅读更多关于inodes的内容.

编辑: stat 可以显示文件的硬链接数。您可以使用 -c '%h' 选项查看:

# after the hardlink to 2File.txt
$ stat -c '%h' aFile.txt 
2

1
非常好的回答+1,只是有一个小建议,您可以添加stat aFile.txtstat -c 2File.txt以显示更多与文件存储相关的信息(尤其是“链接:2”),或者使用stat -c%h aFile.txt来计算它的硬链接数。这样回答就会更加完美! - Allan
1
这是一个非常好的例子!在堆栈溢出上有其他过去的例子对于像我这样的初学者来说并没有意义,但是这个例子很容易理解。谢谢! - user8930130
“Original file gets deleted”这个注释是误导性的。删除文件的链接并不会删除文件本身。而“inode is pointing to the same location”这个注释也是误导性的。aFile.txt和2File.txt都是指向同一个文件的链接。也就是说,它们都指向同一个inode。 - William Pursell
@WilliamPursell 我在某种程度上不同意这个观点。在这里,"deleted" 表示用户尝试删除文件,但是发现硬链接仍然存在。这说明了两件事情,即 "this" 与符号链接的区别以及 "delete" 的含义(直观地),从而暗示了 inode 的重要性/功能。 - iamauser

0

硬链接指向文件系统中相同的inode。我把它看作是一个镜像,如果你在其中一个硬链接中写入,另一个链接将显示相同的信息,在一天结束时,你实际上是在写入相同的inode。软链接类似于Windows中的快捷方式,如果原始文件被删除,则软链接丢失并且不可用。您已经有了包含示例的主答案,希望现在你理解了。


0

硬链接永远不会指向已删除的文件。硬链接就像指向实际文件数据的指针。这个指针在文件系统术语中称为“inode”。换句话说,创建一个硬链接就是创建另一个inode或文件的指针。

拥有指向空的指针至少是没用的,令人困惑的。我的意思是,当你使用ls命令查看文件时,你会在那里看到文件。但如果你打开它时被告知“没有这样的文件”,你的反应可能是"$#%*!@?"

没有指针的数据也是无用的。因为你没有办法打开文件。你失去了对它的控制,但它确实存在。当您的硬盘/固态硬盘崩溃并且文件系统损坏时,就会发生这种情况。恢复工具可能会找到引用计数为零的文件数据,并将它们放置在EXT2、3、4的lost+found目录中。

因此,在任一情况下,Linux内核都不允许您创建这样的链接/ inodes /指针。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接