如果创建硬链接,如何分辨哪个文件是原始文件


34

例如,我有一个文件myold_file。然后,我使用以下ln方法创建一个硬链接mylink

ln myold_file mylink

然后,即使使用ls -a,也无法确定哪个是旧的。

反正有话要说吗?


2
反问:如果您这样做ls > a; ln a b; rm a; ln b c,哪一个比另一个“更原始”?a走了,你留下了b,并c...
glglgl

2
您想达到什么目的?您想达到什么目的?没有这样的“原始”。文件是包含元数据和包含数据的块的集合的索引节点。目录可以包含指向该文件的链接,该链接是文件名和索引节点号。您可以创建任意数量的文件链接。文件可能永远不会少于一个链接。
2014年

对于这个问题的答案接受的详细解释:见接受的答案这个问题
Utku 2015年

Answers:


93

您不能这样做,因为它们实际上是同一个文件,只能通过不同的路径访问。第一个没有特殊地位。


4
这显然是正确的答案:OP的问题是基于一种误解。
Daniel Earwicker 2014年

8
@Adnan实际上,不:这两个硬链接是同一文件。它们是不同的目录条目。珍妮D的术语是正确的。
吉尔斯(Gilles)'所以

1
@吉尔斯,我看不出它是如何正确的。两个硬链接不是两个文件 ; 硬链接不是文件。它们将指向(因此链接)到同一文件(这是磁盘上的物理位置)。说“两个硬链接实际上是同一个文件”是错误的。
2014年

1
@JennyD这几乎是我听到使用“硬链接”的唯一方法;指向索引节点的文件系统指针。好吧,我想我们都是对的。我将不再争论这是没有意义的。您的回答对我来说似乎是正确的,我给了+1,我会保留。
2014年

5
说硬链接“是”文件正在比较不同类别的内容,这在技术上是不正确的。但是,当我们通常说“ .bashrc是一个包含...的文件”时,我们的意思是“相对路径.bashrc是指包含...的文件”,这是类别的常见混合形式,我们应该理解,只要有一个引用路径或目录条目“是”文件,我们指的是它所引用的文件。基于这种理解,两个硬链接可以“成为”同一文件。他们不赞成采用正式语言,而是不能这样做。两种立场都有自己的立场:-)
史蒂夫·杰索普

16

没有直接,干净(可靠)的方法可以做到这一点。但是在适当的情况下,这是可能的(或至少是可能的)。问题是有两个硬链接,但只有一个文件。更改,修改和(也许)创建时间仅存储文件(节点),而不存储目录条目(硬链接)。因此,您想要的信息只能从次要效果中获取,这些次要效果可以通过与文件无关的操作轻松破坏。而且您甚至看不到它是否已被销毁。如果您完全了解操作情况,则只能从操作情况中知道。

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

  1. 链接在不同目录中

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

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

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

ls -lU

为了使您对条目的创建顺序有一个印象。这不必是正确的顺序,因为可以删除条目,以便在目录列表的中间创建新条目。而且正如Gilles指出的那样,它与更新的文件系统根本不兼容。


2
没有提到selinux,审计跟踪或监视文件系统日志???假笑如果没有审核跟踪,就无法知道 -其他是经过计算的猜测
Ricky Beam

1
@mikeserv如果您想用这种方式教别人,那么您至少应该学会正确地引用。它并没有在这个问题:“哪个文件”之称。即使这样做了,这也只是一个措辞上的问题,如果花些心思去理解这个问题,就会很容易地揭示出问题的实质。
Hauke Laging

4
如果情况合适(很少见),则目录mtime技巧将起作用。但是,在呈现方式上,有时会得出相反的结论。如果目录mtime等于文件的ctime,则它仅是一个有价值的指示。但是,该ls -lU技巧在现代文件系统(ext4,btrfs,zfs)上不起作用,其中条目根本不会按创建顺序显示。
吉尔斯(Gilles)'所以

2
@mikeserv-OP的问题是基于一种误解。如果它们这样做的rm myold_filemylink,它仍然存在并且可以完美地工作,因为它是引用相同基础inode的同等好条目。仅当两者都删除时,系统才能丢弃索引节点。一旦使用硬链接创建了引用同一文件的两个文件系统条目,它们就等效。(请注意,“文件”此处的意思是“保存文件数据而不是目录数据的inode)。请参阅:en.wikipedia.org/wiki/Inode
Daniel Earwicker 2014年

1
-1,因为,尽管有关更新表时目录在某些文件系统中如何变化的信息,但是此答案无法消除存在以下问题的误解:在多个硬链接的情况下,“原始文件”不是属性到单个inode。从这个意义上讲,虽然有趣,但并不是大多数人都应该了解硬链接的基本概念。这个问题并不缺少“直接的清洁方法”,而是首先没有“它”
Caleb 2014年

10

如果您依靠目录的最后修改时间,而又不知道如何以及何时更改这些目录,那么依靠mtime可能会导致您在某些百分比的时间里出错。这里的问题是文件在文件系统中由索引节点而不是目录条目表示。目录条目(文件名)指向索引节点,而不是文件。

我想我会做些肚脐的事情,以了解为什么我需要知道哪个目录条目较旧,以及如何避免需要知道这一点。


8

我认为这个问题(相当合理地)对于真正的硬链接是错误的。我认为,最正确的直接答案是“他们俩都是”

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

如果您想保留“原始”文件和新文件的概念,则可能会寻找符号链接,它们更多是别名,只是向OS发出的一条指令,它应按一条路径操作,就好像它们无需更改其下的文件结构。(您可以使用“ ln -s文件链接”进行创建。


您知道,Bob / Joe对他的年龄可能真的很敏感...硬/软链接比较是不错的选择-特别是当您考虑到硬链接只会将条目添加到目录文件中时-已经存在索引节点-但是软链接本身就是一个文件,因此被分配了自己的索引节点。尽管如此,在这两种情况下,修改时间仅与链接文件有关,因为对任何重要链接的唯一修改只能是创建/删除。
mikeserv 2014年

2

上面其他几个答案给出的问题的症结在于,每个文件名都是文件的硬链接。没有真正的原创作品,可能只有第一个。

将目录视为一个列出文件名和索引节点号的表。

每个硬链接(包括第一个硬链接)都是目录中的一项,该目录为inode编号分配“文件名”,以便您可以使用该名称访问文件。

该文件是磁盘上的块的集合,由存储在inode中的元数据进行管理和跟踪。一个文件有一个索引节点号。

通过文件名访问文件数据的过程分为三个步骤:在目录中查找文件名以获得索引节点号。然后引用索引节点查找包含数据的一个或多个相关磁盘块。然后最后读取/写入这些块。

因此,从本质上讲,这一切都是这样:使用第一个(“原始”)访问文件内容或随后创建的任何硬链接绝对没有区别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.