您什么时候可以使用另一个?
您什么时候可以使用另一个?
Answers:
硬链接和软链接之间的语义不同,使它们适用于不同的事物。
硬链接:
符号链接(软链接)
ls -l
将显示符号链接指向的路径)unlink(2)
。“正常”文件(链接计数为1)只是一种特殊情况。如果有帮助,您可以将inode视为对象,将名称视为ref计数的指针(inode的链接数为reference-count)。
..
和.
。
两种类型的链接的目的是提供一种使文件同时出现在两个位置的方法。这有很多用途。您要使用符号链接,十分之九。
符号链接或“符号链接”的工作方式与Windows快捷方式类似。符号链接的内容是指向文件/目录实际位置的指针。如果删除实际文件,则符号链接将变为“悬挂”,并且将不起作用。删除符号链接不会删除真实文件。您可以根据需要为单个文件设置尽可能多的符号链接(甚至其他符号链接)。
但是,与Windows不同,它们在文件系统级别而不是外壳程序或应用程序级别上工作,因此几乎所有应用程序都将按预期“跟随”符号链接。 ls -al
可以用作查看符号链接“指向”何处的快速方法。
硬链接甚至可以在较低级别上使用。硬链接是文件的实际,物理上文件系统级的目录条目。从技术上讲,目录条目是一个硬链接,因此,每个文件在某个位置的目录中至少有一个硬链接。硬链接并不与其指向的文件分开。如果文件在不同目录中具有多个硬链接rm
,则在所有硬链接都消失之前,使用类似的实用工具删除硬链接不会真正删除该文件。
我想不出通常甚至需要使用硬链接的情况,除非您有意防止文件被删除或者对分区或其他与文件系统相关的事情进行了一些怪异的低级工作。编辑:这个问题的其他答案中有很棒的主意!
ls -l
足以看到符号链接所链接的内容,a
代表--all
,请参见联机帮助页。即使符号链接在文件系统上起作用,也存在将符号链接用作文件而不是跟随符号的替代功能。
ln -s /home 1; ls -l 1
显示符号链接1的长度为5个字节,而ln -s /usr/share/ 2; ls -l 2
符号2的长度为11个字节。
硬链接对于基于磁盘的备份机制非常有用,因为您可以为每个备份使用完整的目录树,同时为未更改的文件共享空间-并且文件系统会跟踪引用计数,因此当最后一次引用时给定版本消失,因为由于空间原因备份已过期/已删除,因此会自动回收其使用的空间。出于相同的原因,某些邮件客户端还将它用于归档到多个文件夹的邮件。
硬链接只是对相同磁盘空间的引用,这就是“为什么”您不能硬链接其他文件系统中的某些内容。
符号链接是链接其他文件的文件(如Windows快捷方式),可能位于同一文件系统中,也可能不在同一文件系统中。
编辑:我将解释更多。每个存在的文件至少具有1个硬链接。硬链接是访问文件系统的索引节点内容的方式。您可以使用来获取文件的inode编号ls -i
,并通过stat
以下示例获取硬链接的数量:
$ stat plantilla-disenos.odt
File: «plantilla-disenos.odt»
Size: 12367 Blocks: 32 IO Block: 4096 fichero regular
Device: 803h/2051d Inode: 319875 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ d4rio) Gid: ( 1000/ d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300
感谢@geekosaur提供此参考:
内核必须重新启动路径名到inode的转换(遍历目录树)以扩展符号链接,而硬链接都使用相同的inode。(从在传统Unix中执行此操作的内核函数的名称中,您经常会看到它被称为namei。)
这(编辑):
硬链接对于像Apple的Time Machine这样的基于磁盘的增量备份机制非常有用,因为您可以为每个备份拥有完整的目录树,同时共享未更改文件的空间-文件系统会跟踪引用计数,因此当由于空间原因而导致备份的过期/删除导致对给定版本的最后引用消失时,将自动回收其使用的空间。出于相同的原因,某些邮件客户端还将它用于归档到多个文件夹的邮件。
干杯
namei
在传统Unix中从执行此功能的内核函数的名称中看到它被称为。)
stat
将失败。
软链接指向另一个路径名。该路径名可能存在也可能不存在。在您访问符号链接之前,不会寻找该路径。如果在尝试访问该路径时不存在,则符号链接已损坏。
通过硬链接,您可以拥有一个具有多个名称的文件。您不能说其中之一是“真实”文件,而其他文件只是该文件的链接。他们都是平等的。没有像断开的符号链接那样断开的硬链接。
硬链接仅在单个文件系统中起作用。如果要链接到其他文件系统(例如,不同的分区或网络共享)上的文件,则必须使用软链接。
另一个很大的不同是删除链接文件时会发生什么。如果删除一对硬链接文件中的一个,然后创建一个具有相同名称的新文件,则将有两个单独的文件(链接消失了)。如果删除符号链接的目标并创建一个具有相同名称的新文件,则该链接将指向该新文件。
“硬”链接共享相同的索引节点
$ touch foo
$ ln foo foolink # Creates a hard link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink
如果我编辑foo或foolink,则只有一个文件,它将被更新。如果仅删除其中一个文件名,则索引节点和数据将保留,foolink将继续存在。
$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink
如果要创建相同的文件,但是要使用“软”或符号链接,那么将有一个文件,一个索引节点和一个新文件,其自身的索引节点指向第一个。
$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo
如果我编辑foo或foolink,仍然只有一个文件,它将被更新。
如果仅删除符号链接,则索引节点和数据将保持不变。如果删除foo,数据将消失,符号链接将保留,但指向不存在的文件。
$ rm foo
removed `foo'
$ ls -l foo foolink
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
硬链接是同一文件的其他目录条目。那意味着
保存时,许多编辑器不会将新内容写入同一文件中,而是执行以下过程:
这种方案意味着到该文件的任何其他硬链接现在都不再指向当前文件,而是指向以前的版本(即使在编辑器删除旧文件的情况下也是如此,因为在Unix下,“删除”一个文件)仅表示删除其链接;仅当删除的链接是唯一的链接时,实际文件才会被删除)。
由于硬链接直接指向文件,因此即使您无权访问该文件的原始位置,您也可以访问该文件(例如,因为您对原始条目所在的目录没有任何权限) 。决定访问的唯一权限是文件本身的访问权限(与文件关联,而不与链接关联;您不能对同一文件进行具有不同权限的硬链接),而路径的访问权限就是硬链接包含在其中(基本上是链接所在目录的执行权限,以及任何直接和间接的父目录)。
另一方面,符号链接存储另一个文件的路径名(文件的名称-或更确切地说,它的目录条目-可能包括其路径,例如/bin/sh
或subdir/foo.bar
)。如果路径名是相对的,则始终相对于包含链接的目录进行解释。这意味着:
符号链接可能引用不同文件系统上的文件(甚至是本身不支持硬链接或软链接(例如FAT)的文件系统)。
如果原始文件被删除,则符号链接不会保留文件内容。除非存在指向同一文件的其他硬链接,否则文件内容将消失。然后,符号链接将悬空(即,引用与目录条目不对应的路径名)。另一方面,删除符号链接不会影响原始文件,因为它仅引用其路径名。
如果原始文件被移动或重命名,则符号链接不会更新,但会悬空。如果移动符号链接,则仅当它包含相对路径时,它才会断开,并且该路径从新位置开始不再有效。
如果原始文件被具有相同名称的新文件替换(如上述编辑器方案中所示),则该链接引用该新文件。
硬链接的大多数使用基本上是一种获得文件副本而不必两次存储文件内容的方法。如果不再更改文件,这将是最好的选择,否则很容易意外断开链接(请参见上面的编辑器方案)。当然,在某些情况下,您希望断开链接,例如保留多个备份:对于新备份中已更改的文件,您也不想更改旧备份中的副本。
通常,如果需要链接,将使用符号链接。一个示例是,当您将目录移至另一个分区(因为该目录已满)时,可以设置从旧位置到新位置的软链接,因此任何尝试访问该旧目录的程序都将而是在新位置访问它。硬链接是不可能的。但是,请注意,如果移动目录中的符号链接包含引出移动目录的相对路径,则它们可能会中断。
硬链接(仅文件)vs软链接(文件或目录)vs绑定(目录的硬链接)
尽管daxelrod的回答很好地说明了这个问题,但我认为这种情况下的情况有很大的不同,特别是对于还不了解inode和复杂的Linux行话的初学者。
想到这一点,如果您从驱动器中“删除”了所有内容,则可以运行软件来还原数据,因为1和0仍然存在,您只需删除所有硬链接。恢复软件的目的是重建硬链接以理解0和1
我读了一个很棒的“一个班轮”,这一切都说得通,我想分享!
Linux中的所有文件都是磁盘上0和1的“硬链接”。当您创建数据(0和1)时,操作系统会在文件树中创建一个硬链接以引用硬盘上的该点。
您可以创建另一个硬链接并删除原始文件,并且仍然可以访问新创建的硬链接。
如果删除了HARD LINK 1,您是否认为SOFT LINK可以工作?否,操作系统将报告不存在HARD LINK 1。
相反,如果删除SOFT LINK,则HARD LINK会起作用吗?是。只要操作系统具有一个HARD LINK 文件,它将报告该填充未被删除。
-还值得研究/注意的是BIND,它是BIND两个目录的一种方式,例如符号链接两个目录,但是对操作系统是透明的(操作系统可以告诉您Symlink,并且某些人有天气规则可以遵循Symlinks)。它使用Mount(而不是LS),并且可以通过FSTAB进行配置。
硬链接将文件保留在磁盘上,直到所有硬链接删除为止,即使第一个硬链接(从技术上来说,“文件名”是硬链接)也已删除。可以保留软链接“悬空”,直到替换它指向的文件。
这是一个非常老的问题,但是我有一个用例,要求我使用硬链接。
我是一名音乐家,所以我的Mac附带的几个硬盘驱动器上有很多各种各样的音频文件。兆兆字节。我使用symlink目录对它们进行了很好的组织,以便可以根据内容发布者,样式/声音以及其他基于我当时的想法的条件来找到它们。不幸的是,我使用的一个程序Ableton Live完全无法从其文件浏览器中查看别名或符号链接。我发现的唯一解决方案是创建我希望它能够看到的目录的硬链接,然后一切正常。
因此,这是另一种情况,您可能需要使用硬链接,而其他人可能没有。