如果创建了硬链接,如何判断哪个文件是原始文件

Buf*_*lls 35 filesystems hard-link

例如,我有一个文件myold_file. 然后我ln用来创建一个硬链接mylink

ln myold_file mylink
Run Code Online (Sandbox Code Playgroud)

然后,即使使用ls -a,我也无法分辨哪个是旧的。

有什么好说的吗?

Jen*_*y D 97

你不能,因为它们实际上是同一个文件,只能通过不同的路径到达。第一个没有特殊地位。

  • @Adnan 实际上,不:两个硬链接是同一个文件。它们是不同的目录条目。Jenny D 的术语是正确的。 (8认同)
  • 说硬链接“是”一个文件是在比较不同类别的东西,这在技术上是不正确的。但是考虑到我们通常说“`.bashrc` 是一个包含...的文件”,当我们的意思是“相对路径`.bashrc` 指的是一个包含...的文件”时,这是类别和我们应该明白,每当一个路径或目录条目“是”一个文件时,我们指的是它所指的文件。有了这种理解,两个硬链接就可以“成为”同一个文件。拒绝该约定以支持正式语言,他们不能。两种立场都有自己的位置:-) (5认同)
  • 这显然是正确的答案:OP 的问题是基于误解。 (4认同)

Hau*_*ing 16

没有直接、干净(可靠)的方法可以做到这一点。但在适当的情况下,这是可能的(或至少是可能的)。问题是有两个硬链接,但只有一个文件。更改、修改和(可能)创建时间仅存储在文件(inode)中,而不存储在目录条目(硬链接)中。因此,您想要的信息只能从次要效果中获取,这些次要效果很容易被与文件无关的操作破坏。你甚至看不到它是否已经被摧毁。只有在您准确了解它们的情况下,才能从操作环境中了解这一点。

硬链接的创建是对包含该链接的目录的写操作。因此它更新目录的mtime. 所以如果

  1. 链接在不同的目录中

  2. 并且您知道在创建第二个硬链接后这些目录都没有更改(文件添加、删除、重命名或文件元数据更改),那么您可以简单地比较mtime目录的s。

特殊情况:如果其中一个目录mtime在文件(inode)之前有一个,mtime并且您可以合理地确定该文件在其创建后的一小段时间内没有被写入,则该目录的链接是较旧的。

如果链接位于同一目录中(这似乎是您的问题),那么情况会变得更糟。然后你可以使用

ls -lU
Run Code Online (Sandbox Code Playgroud)

以获得对条目创建顺序的印象。这不需要是正确的顺序,因为条目可能会被删除,以便在目录列表的中间创建新条目。正如 Gilles 指出的那样,它根本不适用于较新的文件系统。

  • 如果情况合适,目录 mtime 技巧将起作用(这种情况很少见)。但是,根据您呈现它的方式,您有时会得出相反的结论。如果目录 mtime 等于文件的 ctime,它只是一个有价值的指示。但是`ls -lU` 技巧在现代文件系统(ext4、btrfs、zfs)上不起作用,条目根本不按创建顺序显示。 (4认同)
  • 没有提到 selinux、审计跟踪或监视文件系统日志???*傻笑*没有审计跟踪,就没有办法*知道*——其他任何事情都是经过计算的*猜测* (2认同)
  • @mikeserv - OP 的问题是基于误解。如果他们做了 `rm myold_file`,那么 `mylink` 仍然存在并且可以完美运行,因为它是一个同样好的条目,引用相同的底层 inode。只有当两者都被删除时,系统才能丢弃 inode。一旦使用硬链接来创建引用同一文件的两个文件系统条目,它们就等效了。(请注意,此处的“文件”表示“保存文件数据的 inode,而不是目录)。请参阅:http://en.wikipedia.org/wiki/Inode (2认同)

小智 10

如果您依赖于目录的最后修改时间,并且您不知道这些目录是如何以及何时更改的,那么依赖 mtime 将导致您在一定百分比的时间内出错。这里的问题是文件在文件系统中由 inode 表示,而不是由目录条目表示。目录条目(文件名)指向 inode,而不是文件。

我想我会仔细观察为什么我需要知道哪个目录条目较旧以及如何避免需要知道这一点。


Val*_*ity 8

我认为这个问题(相当合理地)误导了硬链接到底是什么。然而,我认为最正确的直接答案是“他们都是”

Unix 文件系统通常在 i-node 中存储实际的文件内容和数据,这些没有任何路径,然后路径与这些 i-node 具有多对一的关系。以一个有两个名字的人为例,鲍勃和乔。不能说鲍勃比乔大,反之亦然,它们只是同一个人的名字。

如果您想保留“原始”文件的概念和一个新文件的概念,您可能正在寻找符号链接,这些更像是一个别名,只是对操作系统的指令,它应该像它们一样操作到一个路径是另一个而不改变下面的文件结构。(您可以使用“ln -s 文件链接”来制作这些。