例如,我有一个文件myold_file
.然后我用来ln
创建硬链接mylink
:
ln myold_file mylink
然后,即使使用ls -a
,我也无法分辨哪个是旧的。
有什么可说的吗?
答案1
你不能,因为它们实际上是同一个文件,只是通过不同的路径到达。第一个没有特殊地位。
答案2
没有直接、干净(可靠)的方法可以做到这一点。但在适当的情况下,这是可能的(或者至少是可能的)。问题是有两个硬链接,但只有一个文件。仅存储文件(索引节点)的更改、修改和(可能)创建时间,而不存储目录条目(硬链接)。因此,您想要的信息只能从次要效果中获取,而次要效果很容易被与文件无关的操作破坏。而且你甚至看不到它是否已被摧毁。只有准确了解运营情况,您才能知道这一点。
硬链接的创建是对包含该链接的目录的写入操作。因此它更新了目录的mtime
.所以如果
链接位于不同的目录中
并且您知道在创建第二个硬链接后,这些目录都没有被更改(文件添加、删除、重命名或文件元数据更改),那么您可以简单地比较
mtime
目录的 s。
特殊情况:如果其中一个目录mtime
在文件(inode)之前有一个mtime
,并且您可以合理地确定该文件在创建后不久才被写入,那么该目录的链接是较旧的链接。
如果链接位于同一目录中(这似乎是您问题中的情况),那么情况会变得更糟。然后你可以使用
ls -lU
以便了解条目创建的顺序。这不一定是正确的顺序,因为条目可能会被删除,以便在目录列表的中间创建新条目。正如吉尔斯指出的那样,它根本不适用于较新的文件系统。
答案3
如果您依赖于目录的最后修改时间,并且不知道这些目录如何以及何时更改,则依赖 mtime 将导致您在一定比例的情况下出错。这里的问题是文件在文件系统中由 inode 表示,而不是由目录条目表示。目录项(文件名)指向 inode,而不是文件。
我想我会仔细思考为什么我需要知道哪个目录条目较旧以及如何避免需要知道这一点。
答案4
上面其他几个人给出的答案的关键是每个文件名都是到文件的硬链接。没有真正的原创,可能只是第一个。
将目录视为列出文件名和索引节点号的表。
每个硬链接(包括第一个硬链接)都是目录中的一个条目,它为索引节点号分配一个“文件名”,以便您可以通过该名称访问该文件。
文件是磁盘上块的集合,由存储在 inode 中的元数据进行管理和跟踪。一个文件有一个 inode 号。
通过文件名访问文件数据分为三个步骤: 在目录中查找文件名以获得索引节点号。然后参考索引节点来查找包含数据的相关磁盘块(或多个块)。最后这些块被读/写。
因此,从所有内容中得出的结论基本上是这样的:使用第一个(“原始”)或任何后续创建的硬链接访问文件内容之间绝对没有区别。