维基百科定义了硬链接作为:
将名称与文件系统上的文件相关联的目录条目。(目录本身是一种特殊的文件,其中包含此类条目的列表。)此术语用于允许为同一文件创建多个硬链接的文件系统。
我想知道硬链接相当于 Windows 的捷径。
如果硬链接不等同于快捷方式,那么最接近硬链接的 Windows 功能是什么?
答案1
不,硬链接完全不同。软链接更接近 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 可以有多个文件指向它,也可以有一个,或者没有。
为了更清楚地理解这一点,使用ls -i
which 显示与文件关联的 inode。让我们创建一个软链接和一个硬链接,看看会发生什么:
ln -s foo SoftLinkToFoo
ln foo HardLinkToFoo
现在,检查它们的 inode:
正如您上面看到的,foo
和HardLinkToFoo
具有相同的 inode(16648029),而 SoftLinkToFoo 具有不同的 inode(16648036)。
如果我们foo
用重命名会发生什么mv foo bar
?
红色表示软链接已损坏,无法再找到其目标。这是因为软链接指向文件的名称,而不是其 inode。请注意,尽管更改了名称,但 inode 保持不变,因此硬链接没有问题,仍然有效。
总结一下,硬链接其实是相同的文件;它们是指向磁盘同一部分的指针。软链接只是快捷方式。打个比方,硬链接就像是同一电话线上的两个不同电话号码,而软链接就像是同一所房子里有两条不同的电话线。
答案2
对于软链接和硬链接是什么有很好的解释,但有一件事需要澄清。
视窗快捷方式等同或类似于两者都不 软链接也不硬链接。在文件系统级别,它们只是文件。shell 理解它们的结构并将它们解释为链接。Windows 快捷方式还可以指向 shell 命名空间中与文件系统无关的对象(打印机、控制面板项、虚拟文件夹)。
Windows 快捷方式除了文件系统对象的名称外,还包含以下信息:PIDL(shell 命名空间内的不透明二进制“路径”)、描述、热键、图标、工作目录。如果使用 NTFS 文件系统,Windows 还会添加 NTFS 对象标识符,以修复损坏的快捷方式。
Windows 快捷方式的大致对应内容是。桌面文件。请参阅 SuperUser 上的这个问题:Linux 中是否有与 .lnk 等效的文件?
答案3
不,在 Linux 中事情的运作方式有所不同。
每个文件都由一个名为“inode”的对象表示。每个 inode 都有一个与之关联的编号 (ID)。
我们知道,人类不擅长记住数字,而是擅长记住名字。(这就是电话簿的演变过程)
因此,filename 应运而生,为每个 inode 赋予一个人类可读的名称。基本上,硬链接将文件名绑定到 inode。一个 inode 可以有多个硬链接。如果某个 inode 没有硬链接,则该 inode 使用的磁盘空间可能会重新分配给新文件。这意味着,每个文件必须至少有一个硬链接。文件名(可视化为您在文件浏览器中看到的文件名/图标)本身就是一个硬链接。
在 Windows 中,快捷方式是一个单独的文件(*.lnk 文件)。它包含有关原始文件的信息(可以理解为文件路径)。在 Linux 看来,Windows 快捷方式将是另一个硬链接到以“.lnk”结尾的文件名的 inode。
答案4
在 Windows 上,如果您有 NTFS 文件系统,您也可以创建硬链接。
fsutil hardlink create target_file source_file
这些文件必须位于同一逻辑驱动器上。