正如标题所说,我想知道命令创建的硬链接和软链接之间的区别ln。该命令man ln确实提供了信息,但没有充分回答我的问题。
此外,如果有人可以提供一个设置,其中硬链接可能比符号链接更可取,那就太好了。
ABc*_*ter 352
并且,“一个例子胜过一百段……”
创建两个文件:
$ touch blah1
$ touch blah2
Run Code Online (Sandbox Code Playgroud)
在其中输入一些数据:
$ echo "Cat" > blah1
$ echo "Dog" > blah2
Run Code Online (Sandbox Code Playgroud)
正如预期的那样:
$cat blah1; cat blah2
Cat
Dog
Run Code Online (Sandbox Code Playgroud)
让我们创建硬链接和软链接:
$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft
Run Code Online (Sandbox Code Playgroud)
让我们看看刚刚发生了什么:
$ ls -l
blah1
blah1-hard
blah2
blah2-soft -> blah2
Run Code Online (Sandbox Code Playgroud)
更改 blah1 的名称无关紧要:
$ mv blah1 blah1-new
$ cat blah1-hard
Cat
Run Code Online (Sandbox Code Playgroud)
blah1-hard 指向文件的 inode,内容 - 没有改变。
$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft
cat: blah2-soft: No such file or directory
Run Code Online (Sandbox Code Playgroud)
找不到文件的内容,因为软链接指向已更改的名称,而不是内容。
同样,如果 blah1 被删除,blah1-hard 仍然持有内容;如果 blah2 被删除,blah2-soft 只是一个指向不存在文件的链接。
来源:公然从StackOverflow复制!
var*_*tec 331
硬链接不是指向文件的指针,而是指向同一 inode 的目录条目(文件)。即使您更改了另一个文件的名称,硬链接仍然指向该文件。如果您用新版本替换另一个文件(通过复制它),硬链接将不会指向新文件。您只能在同一文件系统中拥有硬链接。对于硬链接,您没有原始文件和链接的概念,所有这些都是平等的(将其视为对对象的引用)。这是一个非常低级的概念。
另一方面,符号链接实际上指向另一个路径(文件名);每次您通过符号链接访问文件时,它都会解析文件的名称。如果您移动文件,符号链接将不会跟随。如果您将文件替换为另一个文件并保留名称,符号链接将指向新文件。符号链接可以跨越文件系统。使用符号链接,您可以非常清楚地区分实际文件和符号链接,符号链接在它指向的文件的路径旁边不存储任何信息。
Qas*_*sim 89
链接有两种类型:软链接(符号链接)或硬链接。
软链接(符号链接)
您可以创建指向文件和目录的链接,并且可以在不同的分区上创建链接(快捷方式)并使用与原始不同的 inode 编号。
如果删除真实副本,链接将不起作用。
硬链接
硬链接仅用于文件;您不能链接到具有不同 inode 编号的不同分区上的文件。
如果删除真实副本,链接将起作用,因为它访问真实副本正在访问的基础数据。
问题:如何制作软链接?
答:软链接可以用ln -s; 首先你需要定义源,然后你需要定义目标。(请记住,您需要定义源和目标的完整路径;否则它将不起作用。)
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
(----------Source-------) ( Destination )
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它有一个不同的 inode,可以在不同的分区上创建。
问题:如何制作硬链接?
答:硬链接可以用ln; 首先你需要定义源,然后你需要定义目标。(请记住,您需要定义源和目标的完整路径;否则它将不起作用。)
假设我在/script名为firefox.
ls -i # Shows you the inode
5898242 firefox
ln /scripts/firefox /scripts/on-fire
( Source ) ( Destination )
Run Code Online (Sandbox Code Playgroud)

如您所见,它具有相同的 inode。如果我删除原始文件,链接仍然有效,它将充当原始文件。

上面,我检查链接是否有效,然后删除原来的firefox脚本。
问题:如果有人能提供一个硬链接可能比符号链接更可取的设置,那就太好了。
答:根据磁盘分区布局,硬链接的限制是它们必须在同一个分区(-1点)并且只能链接到文件(-1点),但如果删除原始链接,则该链接将起作用并且它的作用就像原来的一样(+1 分)。
另一方面,软链接可以指向目录或文件(+1 分)并且没有分区限制(+1 分),但是如果删除源,则链接将不起作用(-1 分)。
psu*_*usi 88
两者都是指向文件的指针;区别在于指针的种类。符号链接按名称指向另一个文件。它有一个特殊的模式位,将其标识为符号链接,其内容是真实文件的名称。因为它只包含一个名称,该名称实际上不必存在,或者可能存在于不同的文件系统上。如果您替换命名文件(更改其内容而不影响其名称),则链接仍包含相同的名称,因此现在它指向新文件。您可以轻松识别符号链接并查看它指向的文件的名称。
硬链接通过 inode 编号指向文件。因此,硬链接与文件的名字没有区别。没有“真实”名称与硬链接名称;所有硬链接对于文件来说都是同样有效的名称。因此,您链接到的文件必须实际存在并且位于您尝试创建链接的同一文件系统中。如果删除原来的名字,那么硬链接仍然指向同一个文件。因为所有硬链接对于文件来说都是同样有效的名称,所以您无法查看文件的其他名称;要找到它,您必须查看每个文件并比较它们的 inode 编号以找到具有相同 inode 编号的其他名称。
您可以从ls -l. 文件模式后的第一个数字是链接数。具有 1 个以上链接的文件在某处具有其他名称,相反,链接数仅为 1 的文件没有(其他)硬链接。
kni*_*ttl 58
硬链接只能在同一个文件系统上工作,它只是同一个 inode 的不同名称(文件由 inode 内部引用)。文件只有在指向其 inode 的最后一个链接消失(您rmd 或unlinkd 最后一个链接)时才会从磁盘中删除。硬链接通常只适用于文件,而不适用于目录。
符号链接(symbolic link)是一个特殊的文件,包含另一个文件的路径。此路径可以是绝对的或相对的。符号链接可以跨文件系统工作,甚至可以指向不同的文件,例如,如果您拔掉外部硬盘驱动器并将其替换为另一个在同一路径上具有不同文件的驱动器。符号链接可以指向文件或目录。
Oli*_*Oli 21
另一个线程的一个答案(现在从您的帖子顶部链接)提到了这个页面,我认为这是一个相当不错的中级解释。如果你迷失在 ascii 艺术中,这里是 tl;dr 版本:
所涉及的内核和文件系统透明地转换所有内容。
所以基于此:
../parent.file)我可能让自己有点困惑,但是通过阅读各种内容,我正在努力寻找标准文件和硬链接之间的区别。我阅读它的方式是每个文件都包含一个硬链接(存储文件名),链接到指向物理数据的 inode。
添加硬链接只是提供了一个带有额外的基于文件系统的指针的 inode。那正确吗?
小智 15
何时使用软链接:
跨文件系统链接:如果要跨文件系统链接文件,则只能使用符号链接/软链接。
链接到目录:如果要链接目录,则必须使用软链接,因为您无法创建到目录的硬链接。
何时使用硬链接:
存储空间:硬链接占用的空间非常小,因为在创建硬链接时没有创建新的 inode。在软链接中,我们创建了一个消耗空间的文件(通常为 4KB,取决于文件系统)
性能:访问硬链接时性能会稍好一些,因为您直接访问磁盘指针而不是通过另一个文件。移动文件位置:如果将源文件移动到同一文件系统上的其他位置,硬链接仍然有效,但软链接将失败。
冗余:如果你想确保你的数据安全,你应该使用硬链接,因为在硬链接中,数据是安全的,直到所有文件的链接都被删除,而不是软链接,你会丢失如果文件的主实例被删除,则数据。
小智 8
当您试图找出“文件名”和硬链接之间的区别时,就会产生混淆,因为没有区别。
您创建的每个文件都由磁盘上的数据和硬链接组成- 这是目录中的文件名和指向磁盘上数据的指针。故事结局。当最后一个(或唯一一个)硬链接被删除时,操作系统知道不再需要数据。
从中您可以看到实际数据永远不会被删除,只有硬链接被删除。当它在磁盘上变得足够拥挤时,数据可能会被另一个文件的数据覆盖。在此之前,可能会恢复已删除文件中的数据,但如果没有硬链接,则很难找到。
如前所述,符号链接只是告诉您“<targetname>在名为<targetfolder>”的文件夹中存在一个文件。它们指向硬链接。他们不知道数据在哪里。硬链接知道这一点。
| 归档时间: |
|
| 查看次数: |
636682 次 |
| 最近记录: |