例如,我有一个文件myold_file
。然后,我使用以下ln
方法创建一个硬链接mylink
:
ln myold_file mylink
然后,即使使用ls -a
,也无法确定哪个是旧的。
反正有话要说吗?
例如,我有一个文件myold_file
。然后,我使用以下ln
方法创建一个硬链接mylink
:
ln myold_file mylink
然后,即使使用ls -a
,也无法确定哪个是旧的。
反正有话要说吗?
Answers:
您不能这样做,因为它们实际上是同一个文件,只能通过不同的路径访问。第一个没有特殊地位。
.bashrc
是一个包含...的文件”时,我们的意思是“相对路径.bashrc
是指包含...的文件”,这是类别的常见混合形式,我们应该理解,只要有一个引用路径或目录条目“是”文件,我们指的是它所引用的文件。基于这种理解,两个硬链接可以“成为”同一文件。他们不赞成采用正式语言,而是不能这样做。两种立场都有自己的立场:-)
没有直接,干净(可靠)的方法可以做到这一点。但是在适当的情况下,这是可能的(或至少是可能的)。问题是有两个硬链接,但只有一个文件。更改,修改和(也许)创建时间仅存储文件(节点),而不存储目录条目(硬链接)。因此,您想要的信息只能从次要效果中获取,这些次要效果可以通过与文件无关的操作轻松破坏。而且您甚至看不到它是否已被销毁。如果您完全了解操作情况,则只能从操作情况中知道。
硬链接的创建是对包含链接的目录的写操作。因此,它将更新目录的mtime
。所以如果
链接在不同目录中
并且您知道在创建第二个硬链接之后,这些目录都没有更改(添加,删除,重命名或更改了文件元数据),那么您只需比较mtime
目录中的。
特殊情况:如果其中一个目录mtime
在文件(inode)的前面有一个,mtime
并且您可以合理地确定文件写入的时间不晚于其创建后的一小段时间,则该目录的链接是较旧的目录。
如果链接在同一目录中(这似乎是您的问题),那么情况会变得更糟。那你可以用
ls -lU
为了使您对条目的创建顺序有一个印象。这不必是正确的顺序,因为可以删除条目,以便在目录列表的中间创建新条目。而且正如Gilles指出的那样,它与更新的文件系统根本不兼容。
ls -lU
技巧在现代文件系统(ext4,btrfs,zfs)上不起作用,其中条目根本不会按创建顺序显示。
rm myold_file
话mylink
,它仍然存在并且可以完美地工作,因为它是引用相同基础inode的同等好条目。仅当两者都删除时,系统才能丢弃索引节点。一旦使用硬链接创建了引用同一文件的两个文件系统条目,它们就等效。(请注意,“文件”此处的意思是“保存文件数据而不是目录数据的inode)。请参阅:en.wikipedia.org/wiki/Inode
我认为这个问题(相当合理地)对于真正的硬链接是错误的。我认为,最正确的直接答案是“他们俩都是”。
Unix文件系统通常在i节点中存储实际的文件内容和数据,它们没有任何路径,因此路径与这些i节点具有多对一关系。打个比方,一个姓鲍勃和乔的人。不能说鲍勃比乔大,反之亦然,它们只是同一个人的名字。
如果您想保留“原始”文件和新文件的概念,则可能会寻找符号链接,它们更多是别名,只是向OS发出的一条指令,它应按一条路径操作,就好像它们无需更改其下的文件结构。(您可以使用“ ln -s文件链接”进行创建。
上面其他几个答案给出的问题的症结在于,每个文件名都是文件的硬链接。没有真正的原创作品,可能只有第一个。
将目录视为一个列出文件名和索引节点号的表。
每个硬链接(包括第一个硬链接)都是目录中的一项,该目录为inode编号分配“文件名”,以便您可以使用该名称访问文件。
该文件是磁盘上的块的集合,由存储在inode中的元数据进行管理和跟踪。一个文件有一个索引节点号。
通过文件名访问文件数据的过程分为三个步骤:在目录中查找文件名以获得索引节点号。然后引用索引节点查找包含数据的一个或多个相关磁盘块。然后最后读取/写入这些块。
因此,从本质上讲,这一切都是这样:使用第一个(“原始”)访问文件内容或随后创建的任何硬链接绝对没有区别。
ls > a; ln a b; rm a; ln b c
,哪一个比另一个“更原始”?a
走了,你留下了b
,并c
...