使用 link 命令查看其工作原理

使用 link 命令查看其工作原理
link file1.txt file2.txt

file1.txt包含ham并且file2.txt包含cheese

123添加了file1.txt。现在file1.txtham123。如果我的理解正确,则在任一文件中所做的任何更改都会影响另一个文件,但file2.txt不会改变。为什么不呢?

这是我的命令的完整且准确的输出版本:

$ ls -li
total 16
1363827 -rw-r--r--@ 1 kim  staff  13 Jan 20 20:09 file1.txt
1363844 -rw-r--r--@ 1 kim  staff  22 Jan 20 20:09 file2.txt
$ cat file1.txt
one
two
$ cat file2.txt
one1
two2
$ link file1.txt file2.txt
link: file2.txt: File exists
$ ls -li
total 16
1363827 -rw-r--r--@ 1 kim  staff  13 Jan 20 20:09 file1.txt
1363860 -rw-r--r--@ 1 kim  staff  10 Jan 20 20:11 file2.txt
$ cat file1.txt
$ cat file2.txt
one1
two2

如您所见,我删除了 file1.txt 中的所有内容。但是,file2.txt 尚未被修改。这两个文件位于同一目录中。我使用文本编辑器创建了它们。

答案1

总结:创建硬链接不是在不同文件之间建立一种关系,使一个文件的新更改反映在另一个文件中。相反,它为相同的文件。您的link命令失败,因为您要求它创建一个名为 的链接file2.txt,但该file2.txt链接已经存在。

如同世界上的人和事物一样,一个文件可以有多个名称。

通常,用某种方式来指代某事物是有用的。对于某些事物,有多种方式是有用的。这不仅限于计算。

例如,“对乙酰氨基酚”“扑热息痛”參考同一种药物。说对乙酰氨基酚是扑热息痛是正确的,说对乙酰氨基酚是扑热息痛也是正确的。这两个名字都不是參考文獻而它们指的是一种特定的化学物质,它与它的任何名称都不是同一回事。

就像自然语言中的单词或短语可以识别人或事物一样,A关联-- 也称为硬链接-- 标识一个文件,有些文件有多个链接。它们不是相互链接,而是指向文件的链接。(准确地说,它们标识的是文件的 inode。见下文。)

当一个文件有多个链接时,它不是该文件有一个真实名称,其他名称都是假名或次要名称。相反,所有链接都为文件提供名称,没有一个链接依赖于其他链接。如果有人向您询问文件的名称,那么无论您指定哪个硬链接,您都是正确的。

当您运行时link,它没有成功,并且没有创建链接。

什么时候link告诉过你link: file2.txt: File exists,这实际上是一个错误消息。因为文件file2.txt已经存在,命令link无法创建该名称的链接。因此file1.txtfile2.txt仍然是单独的文件,这就是它们能够具有不同内容的原因。

link命令不会在单独的文件之间创建关系。它为同一个文件创建另一个名称。该名称可能不同,或位于不同的目录中,或两者兼而有之,但它与文件的关系与原始名称相同。您可能听说过一种常见但不太精确的简写形式是“硬链接文件。”

链接和 Inode

尽管对许多用户来说,每个文件都存在于一个特定的目录中,并且只有一个名称,这是很直观的,这些事情不是真的。 反而:

  • 文件的内容可能在物理上遍布整个磁盘
  • 元数据关于在哪里可以找到文件的内容,以及所有者、群组所有者、权限以及任何扩展属性文件中的信息都存储在一个叫做索引节点. (inode 还包含一些其他信息。
  • 对于每个不同的文件,只有一个 inode,并且每个 inode 都用一个数字来标识。这索引节点号是运行时显示在左列的数字ls -li(而仅运行 时则根本不显示ls -l)。驻留在同一设备上的两个不同文件始终具有不同的 inode 编号。
  • 能够想象一个文件有一个名字是很有用的,并且居住在某处在一个目录层次结构。因此,一个文件可能有一个或多个链接(也叫硬链接,因为还有别的东西叫做“软”或“符号”链接)。每个链接只有一个名称和位置。文件的链接是链接到 inode
  • 文件的 inode 包含当前存在多少个链接。创建新链接时,此计数为递增; 当链接被移除时,它会减少。当它减少到零时——也就是说,当最后一个链接被移除时——然后该文件已被删除。
  • ln(不含-s)、cp -llink命令会创建指向现有文件的附加链接。例如,link file1.txt file2.txt要求链接file1.txt已经存在,并且不存在链接,它会创建指向链接到的同一文件的file2.txt新链接。大多数情况下,说“是指向 的链接”就足够了。说“是指向 的链接”同样正确。在内部,两者都不指向对方,而是都指向同一个 inode。file2.txtfile2.txtfile2.txtfile1.txtfile1.txtfile2.txt
  • rmunlink命令删除链接。当我们运行 时rm foo,我们倾向于认为这是删除foo,但文件中的数据不会丢失,并且直到全部删除指向文件的链接。通常一个文件只有一个链接,但并非总是如此。

    (但请记住,符号链接是不是与硬链接相同。文件的符号链接不是防止文件删除时数据丢失!)

创建另一个文件链接

要成功试验硬链接,您可以确保file1.txt存在 和file2.txt不存在。然后当您运行 时link file1.txt file2.txt,您将有两个链接,file1.txtfile2.txt。运行时ls -li您将看到它们具有相同的 inode 编号。

现在file1.txtfile2.txt是同一个文件。

最后,您可能希望使用ln而不是linkln命令是更多常用防止某些错误并且在某些系统上,有更好的错误消息。(当您使用ln命令没有标志-s,它会创建硬链接,命令也是如此link。传递-s标志会导致创建符号链接。)

进一步阅读

答案2

这取决于您如何添加该文本。如果您输入echo foo >> file,您仍然只有一个文件。某些文本编辑器会删除原始文件或重命名它以进行备份,这会破坏链接或保留与备份的链接。

相关内容