硬链接和Windows快捷方式是否等同?

维基百科将硬链接定义为:

一个目录条目,将名称与文件系统上的文件关联起来(目录本身是包含此类条目列表的一种特殊类型文件)。该术语用于允许为同一文件创建多个硬链接的文件系统。

我想知道硬链接的概念是否等同于Windows中的快捷方式

如果硬链接不等同于快捷方式,那么最接近硬链接的Windows功能是什么?


1实际上,你分享的维基页面上有一些很好的参考资料。 - eccentricSam
8Microsoft NTFS支持硬链接,它们与Unix硬链接非常相似。我认为快捷方式是Windows环境中的特殊对象,但与文件系统组织无关,不像真正的硬链接。 - Kiwy
以下链接提供了一个很好的解释:http://comptb.cects.com/2268-overview-to-understanding-hard-links-junction-points-and-symbolic-links-in-windows - user256811
3我认为这个类比是误导性的。快捷方式只是“接口”链接,它们只是包含有关目标的文本信息的文件,由接口而不是文件系统进行解释。从命令行来看,它们并没有真正指向文件系统中的某个东西。Windows(或者更准确地说是NTFS)有适当的符号链接 https://en.wikipedia.org/wiki/NTFS_symbolic_link ,它们既不是快捷方式也不是硬链接。事实上,我在Windows中使用它们将Dropbox文件夹放在任何位置,这是无法通过快捷方式实现的。 - alfC
5Windows的快捷方式文件非常类似于Linux的.desktop文件。Linux的符号链接和硬链接是完全不同的概念,尽管有时候可以达到相同的目的。 - mikebabcock
5个回答

不,硬链接是完全不同的。软链接更接近于Windows的快捷方式(尽管存在重要差异,符号链接与Windows的快捷方式更相似)。硬链接是一种完全不同的东西,你几乎永远不会需要它。
简而言之,使用以下命令创建软链接:
ln -s foo bar

如果你运行ls -l,你会看到:
lrwxrwxrwx 1 terdon terdon 3 Mar 10 15:58 bar -> foo
-rw-r--r-- 2 terdon terdon 0 Mar 10 15:58 foo

"

->的意思是bar是指向foo的链接。因此,打开bar,例如使用文本编辑器,实际上会打开单独的文件foo。然而,删除bar只会删除快捷方式,不会影响文件foo

另一方面,硬链接是使用以下命令创建的:

"
ln foo bar

如果你现在运行ls -l命令,文件之间没有任何关联的指示。
-rw-r--r-- 2 terdon terdon 0 Mar 10 15:58 bar
-rw-r--r-- 2 terdon terdon 0 Mar 10 15:58 foo

但是——这一点非常重要——它们实际上是同一个文件。在Unix文件系统中,文件是使用inode存储的;inode基本上是文件系统将文件名映射到物理硬盘上特定位置的方式。因此,硬链接是指向与其目标相同的inode的文件。换句话说,所有文件实际上都是指向它们的inode的硬链接。创建一个文件的硬链接只是在文件系统上创建一个指向相同inode的新指针(文件)。每个inode可以有多个指向它的文件或一个文件,或者没有文件。
为了更清楚地理解这一点,可以使用ls -i命令显示与文件关联的inode。让我们创建一个软链接和一个硬链接,看看会发生什么:
ln -s foo SoftLinkToFoo
ln foo HardLinkToFoo

现在,检查它们的索引节点(inodes):

enter image description here

如您所见,上述代码中的fooHardLinkToFoo具有相同的inode(16648029),而SoftLinkToFoo则有一个不同的inode(16648036)。
如果我们使用mv foo barfoo重命名为bar,会发生什么呢?

enter image description here

红色表示一个损坏的软链接,即目标文件无法找到。这是因为软链接指向的是文件名,而不是它的inode。请注意,尽管更改了文件名,但inode仍然保持不变,所以硬链接是正常的,它仍然有效。
总之,硬链接实际上是同一个文件的两个表现形式;它们是指向磁盘上相同部分的指针。软链接只是快捷方式。用一个现实世界的类比来说,硬链接就像是同一电话线路的两个不同电话号码,而软链接则像是在同一栋房子里有两条不同的电话线路。

6@Kiwy 正好相反:绝对符号链接在许多不同的情况下都会失败(一旦你移动数据、将其挂载到不同的位置、备份等),最好避免使用它们。 - Gilles 'SO- stop being evil'
4值得注意的是,通过rmunlink()删除硬链接只会将链接计数减少到零,当链接计数达到零时,文件内容所占用的块才会被释放。我不确定说“硬链接实际上是同一个文件的两个实例”是否严格正确,因为这两个名称指向同一个inode,从而指向相同的内容,而不是以任何方式存在两个文件实例。 - Emmet
7请注意,Windows快捷方式是由shell使用的文件,因此可以执行shell了解的操作,但不能执行文件系统操作。例如,您可以将快捷方式创建到shell命名空间(例如控制面板、计算机等),或者可以创建指向尚未安装的应用程序的快捷方式(在首次使用时将安装)。这些操作在文件系统世界中没有直接对应的功能。 - Joey
2我喜欢这个答案,但它实际上对于理解Windows快捷方式是相当差的。下方的@Shaakunthala给出了更好的回答,因为Windows快捷方式更像Linux的.desktop文件,而不是符号链接。 - mikebabcock
这个回答是否表示,如果我创建一个硬链接并编辑原始文件,那么更改会在链接上显示出来?我在 macOS 上尝试过,似乎原始文件和链接是无关的。 - KcFnMi
@KcFnMi 是的,"硬链接"是同一个文件。它们是文件系统中指向同一文件的两个条目。"软链接"更接近你对链接的想法。然而,在这两种情况下,任何在一个链接中进行的更改都会在另一个链接中看到。如果你没有看到这一点,可能是因为你使用了一个生成文件副本的编辑器。尝试从命令行向文件添加一些内容。如果hardlink是硬链接,请执行echo "foo" >> hardlink。然后打开原始文件,你会看到foo已经被添加进去了。 - terdon
看起来你是对的,而且 Xcode 在和我开玩笑。 - KcFnMi

关于软链接和硬链接有一个很好的解释,但有一点需要澄清。

Windows的快捷方式既不等同于软链接也不等同于硬链接。在文件系统级别上,它们只是文件。只有Shell能理解它们的结构并将其解释为链接。Windows快捷方式还可以指向与文件系统无关的Shell命名空间中的对象(如打印机、控制面板项、虚拟文件夹)。

除了文件系统对象的名称外,Windows快捷方式还包含以下信息:PIDL(Shell命名空间中的不透明二进制“路径”)、描述、热键、图标、工作目录。如果使用NTFS文件系统,Windows还会添加NTFS对象标识符来修复损坏的快捷方式。

Windows快捷方式的大致等价物是.desktop文件。请参阅SuperUser上的这个问题:Linux中是否有类似.lnk的等价物?


在Linux中,事情的运作方式不同。
每个文件都由一个称为“inode”的对象表示。每个inode都有一个与之关联的编号(ID)。
我们知道人类不擅长记住数字,但擅长记住名称。(这就是电话簿的演变方式)
因此,文件名出现在图片中,给每个inode赋予了一个可读的名称。基本上,硬链接将文件名绑定到一个inode上。一个inode可以有多个硬链接。如果某个inode没有硬链接,该inode占用的磁盘空间可能会被重新分配给新文件。这意味着每个文件至少必须有一个硬链接。文件名(在文件浏览器中看到的文件名/图标)本身就是一个硬链接。
在Windows中,快捷方式是一个单独的文件(*.lnk文件)。它包含有关原始文件的信息(可以理解为文件路径)。在Linux的视角中,Windows的快捷方式将是另一个与以“.lnk”结尾的文件名硬链接的inode。

3NTFS实际上就是这样工作的。文件是MFT中的一个条目,目录条目只是将文件名映射到文件ID。它支持硬链接,并且自2008/7/Vista(?)以来,甚至支持符号链接。在这一点上,最大的区别是文化上的。 - cHao

大的不同点是,无法为文件夹创建硬链接,但可以为文件创建。
“快捷方式”可以用于创建文件夹,所以不能说它们是等同的。
你的问题应该是“符号链接”或“软链接”与“快捷方式”的区别。
根据以下解释:
符号链接是在文件系统级别,所有内容都将其视为原始文件。应用程序无需特殊支持即可使用符号链接。
“快捷方式”只是一个常规文件,其中包含对目标文件或目录的引用。
因此,当您单击快捷方式时,会将您的目录更改为实际文件的位置,而软链接将引用其位置,就像它是实际文件一样,在Linux中,您可以使用终端和cd命令导航到符号链接,而无法导航到快捷方式。
Windows快捷方式和Linux启动器(指向某个位置)将是相同的。

2什么?软链接只是文件,虽然有些奇怪,但它们也占用inode。它们并不被视为原始文件(那是硬链接)。尽管在大多数操作系统中,目录不允许使用硬链接,但这只是一种安全特性,也有例外情况(例如OSX的时间机器)。当然,你可以进入快捷方式(我假设你指的是Windows快捷方式,因为你说你可以进入软链接)。 - terdon
1你确定你可以使用cmd命令转到一个快捷方式吗? - nux
1我刚刚启动了我的Windows虚拟机,并在桌面上创建了一个文件夹的快捷方式,Windows的快捷方式与符号链接非常相似(如果不是完全相同的话)。尽管由于某种原因你不能使用cmd.exe进入它们,但你可以创建一个.lnk文件指向一个目录,并通过资源管理器来使用它。 - terdon
@terdon 最近的NTFS上确实存在sysmlink - Kiwy
@terdon 看看这个区别:http://superuser.com/questions/253935/what-is-the-difference-between-symbolic-link-and-shortcut - nux
http://unix.stackexchange.com/questions/29593/is-a-symbolic-soft-link-similar-to-a-shortcut-alias-on-a-desktop - nux
http://earthwithsun.com/questions/253935/what-is-the-difference-between-symbolic-link-and-shortcut - nux
1投票者应该给出一个降低投票的理由。 - nux
1是的,但这一切都与Windows有关。就像你所说的,你不能使用cmd.exe进入它,但在图形界面中可以。对于普通用户来说,在*nix系统中你会使用符号链接,而在Windows中则会使用快捷方式。我给你的回答点了踩,因为其中包含了多处不准确之处,正如我在第一个评论中所解释的那样。最重要的是,符号链接并不被视为原始文件,它们只是指向它的。 - terdon
请查看我的回答,现在应该清楚了。 - nux
6抱歉,还是不正确。符号链接是包含其目标的纯文本文件(参见这里),符号链接并不被视为原始文件,这就是符号链接和硬链接之间的整个区别。Linux启动器(我猜你指的是.desktop文件)与此完全无关,它们是完全不同的东西。正如你自己所说,Windows快捷方式可以指向文件(包括程序)和文件夹(Mac和Windows有文件夹,Linux有目录)。.desktop文件只是允许你启动一个程序,它们并不链接到任何地方。 - terdon
这个问题点赞,因为它实际上解释了“快捷方式”只是一个普通文件。 - FlexMcMurphy

在Windows上,如果你有NTFS文件系统,你也可以创建硬链接。
fsutil hardlink create target_file source_file

文件必须位于同一逻辑驱动器上。

1没错 - NTFS也支持硬链接。通常,这些工具需要您拥有管理员权限才能创建它们。关于"相同的逻辑驱动器" - 更准确地说,它们需要在相同的文件系统上。一个"逻辑驱动器"可以是任何东西,包括由subst命令创建的驱动器号。一个工具可能不知道或不关心这一点,因此可能会拒绝创建硬链接。非常有用的一个工具是Link Shell Extension,它使资源管理器能够创建硬链接。 - Tobias