link file1.txt file2.txt
file1.txt
包含ham
并且file2.txt
包含cheese
。
我123
添加了file1.txt
。现在file1.txt
有ham123
。如果我的理解正确,则在任一文件中所做的任何更改都会影响另一个文件,但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.txt
和file2.txt
仍然是单独的文件,这就是它们能够具有不同内容的原因。
该link
命令不会在单独的文件之间创建关系。它为同一个文件创建另一个名称。该名称可能不同,或位于不同的目录中,或两者兼而有之,但它与文件的关系与原始名称相同。您可能听说过一种常见但不太精确的简写形式是“硬链接是文件。”
链接和 Inode
尽管对许多用户来说,每个文件都存在于一个特定的目录中,并且只有一个名称,这是很直观的,这些事情不是真的。 反而:
- 文件的内容可能在物理上遍布整个磁盘。
- 元数据关于在哪里可以找到文件的内容,以及所有者、群组所有者、权限以及任何扩展属性文件中的信息都存储在一个叫做索引节点. (inode 还包含一些其他信息。)
- 对于每个不同的文件,只有一个 inode,并且每个 inode 都用一个数字来标识。这索引节点号是运行时显示在左列的数字
ls -li
(而仅运行 时则根本不显示ls -l
)。驻留在同一设备上的两个不同文件始终具有不同的 inode 编号。 - 能够想象一个文件有一个名字是很有用的,并且居住在某处在一个目录层次结构。因此,一个文件可能有一个或多个链接(也叫硬链接,因为还有别的东西叫做“软”或“符号”链接)。每个链接只有一个名称和位置。文件的链接是链接到 inode。
- 文件的 inode 包含当前存在多少个链接。创建新链接时,此计数为递增; 当链接被移除时,它会减少。当它减少到零时——也就是说,当最后一个链接被移除时——然后该文件已被删除。
- 这
ln
(不含-s
)、cp -l
和link
命令会创建指向现有文件的附加链接。例如,link file1.txt file2.txt
要求链接file1.txt
已经存在,并且不存在链接,它会创建指向链接到的同一文件的file2.txt
新链接。大多数情况下,说“是指向 的链接”就足够了。说“是指向 的链接”同样正确。在内部,两者都不指向对方,而是都指向同一个 inode。file2.txt
file2.txt
file2.txt
file1.txt
file1.txt
file2.txt
这
rm
和unlink
命令删除链接。当我们运行 时rm foo
,我们倾向于认为这是删除foo
,但文件中的数据不会丢失,并且直到全部删除指向文件的链接。通常一个文件只有一个链接,但并非总是如此。(但请记住,符号链接是不是与硬链接相同。文件的符号链接不是防止文件删除时数据丢失!)
创建另一个文件链接
要成功试验硬链接,您可以确保file1.txt
存在 和file2.txt
不存在。然后当您运行 时link file1.txt file2.txt
,您将有两个链接,file1.txt
和file2.txt
。运行时ls -li
您将看到它们具有相同的 inode 编号。
现在file1.txt
和file2.txt
是同一个文件。
最后,您可能希望使用ln
而不是link
。ln
命令是更多常用,防止某些错误并且在某些系统上,有更好的错误消息。(当您使用ln
命令没有标志-s
,它会创建硬链接,命令也是如此link
。传递-s
标志会导致创建符号链接。)
进一步阅读
答案2
这取决于您如何添加该文本。如果您输入echo foo >> file
,您仍然只有一个文件。某些文本编辑器会删除原始文件或重命名它以进行备份,这会破坏链接或保留与备份的链接。