欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

符号连接、软连接、硬连接、快捷方式、副本(copy)之间有何区别和联系?

通过百度、google只明白了部分(可能有理解有误的地方,还望指正):
1,快捷方式(shortcut)是一个.lnk类型的普通文件,只是可以指向系统中任何合法的位置。
2,符号连接(symbolic link)和快捷方式类似,但是,只有人和Windows内部知道这个是符号连接,其他程序会把它认作是它所指向的文件夹。删除符号连接不影响源文件。
3,软连接(junction link),软连接在建立时会自动引用源文件(或目录)的绝对路径,而符号连接允许相对路径的引用。这个不太懂,相对路径绝对路径什么情况下使用?。
4,硬连接(hard link),同一源文件的另一个别名,彼此不受读写影响。这个也不太懂,它和副本有什么区别?
5,副本(copy),和源文件一样的另一个文件。

我想知道的是:
1,为什么会有这么多类型?
2,分别如何使用的?为什么这种情况下用这个而不用那个?

PS:我不是开发者,也不是搞计算机的,只是普通用户,这个问题只是由使用dropbox而了解到mklink命令时引起的,现在对这几个名词只是一知半解。我只是希望能够搞清楚这个问题。wiki看了,只是不懂的名词太多,一个一个弄懂太耗精力了.....好吧,我还是有点懒....我先继续看wiki...
PPS:Windows的库(library)好像就是一种符号连接(symbolic link),不知道对不对。
关注者
94
 
被浏览
11725
 

10 个回答

其实只有两种:硬链接和符号链接。

谁说硬链接是读写不受影响的?

硬链接就是:一面墙上有一个洞,洞里放着一个苹果。从墙的这一面看是这个苹果,从墙的另一面看还是同一个苹果。

硬链接就是同一块数据但有两个不同的名字,读写的时候本质上都是修改的同一块数据。硬链接在删除的时候只是删除了一个名字。只有一块数据的所有名字都删除了的时候,数据才会被删除。(删除的时候相当于把墙的这一面糊上,但苹果本身不动,只有两面都糊上了,你才会看不到)

符号链接就是:我声称我有一个苹果,但是当你找我要的时候,我对你说,到某个建筑物的仓库就可以拿到那个苹果了。可见我并不真正拥有一个苹果,我只是拥有“某个地方有一个苹果”这个信息。但对于外部的观察者来说,这跟我实际上拥有一个苹果并无差异。

符号链接的删除:假设我死了,不会影响到原始数据。假设原始数据没了,那我这个符号链接就变成了一张空头支票,也就是悬空的符号链接。

快捷方式:本质上就是符号链接,只不过 Windows 的资源管理器可以直接管理这种文件。

junction points:可能跟符号链接的区别仅仅是能否使用相对路径。

复制:把一个苹果变成两个苹果。

链接都是为文件起别名(alias)的方式,跟复制有本质区别的。

问题中这5种对象,分别在2个不同的OS中,你应该分类理解。

部分对象有类比性,但是不能强行横向对比。

这五种对象的发展,和OS中文件系统(FS)的发展和实现方式有紧密联系,同样不能割裂来看。

我觉得问题的主人自己归纳一下,会收获更大,我就不码字了。
---------以下更新wiki,以及分OS的横向对比---------
Symbolic link

链接方式其实是为了更好更方便的帮助应用程序使用操作系统中文件系统的资源。
当然相对操作系统,文件系统的不同,以及目标的不同,所以实现的方式也不同。

这里有个基础概念:当文件保存在硬盘中,实际上有两份重要信息:
(可以这样理解)
A. 文件名以及文件存放的空间地址
B. 文件实际内容的存放

副本?
所以这就直接将副本(copy)和其他链接方式区别开来:副本就是将A,B两份硬盘数据全部拷贝一遍,实际上对于操作系统或者应用程序就是不同的两个文件,可能数据信息是相同的,但是所存放的空间位置,目录位置等等都是不同的。两个文件的两个信息分别使用A1,B1,A2,B2来替代,则这种情况文件情况是:
A1 不等于 A2
B2 不等于 B2。
两个文件没有任何直接关系。

软连接、硬连接
软连接、硬连接通常是Linux/Unix的概念。
软链接同样是建立了个文件,但是这个文件保存的信息是:
A. 文件名以及文件存放的空间地址--这时保存的是软链接的名字
B. 文件实际内容的存放--这时保存的是实际指向的另外一个文件。
两个文件的两个信息分别使用A1,B1,A2,B2来替代,则这种情况文件情况是:
A1 不等于 A2
B1 包含的是 A2的信息。
文件查找路径是 A1--> B1 --> A2 --> B2,最终访问B2数据。
硬链接可以指向文件,也可以指向目录。可以跨越任何文件系统。拷贝删除原始文件或者链接文件,不会造成相互影响。

硬连接就不是建立个文件而已了,实际上是建立了不同的A信息,两个文件的两个信息分别使用A1,B1,A2,B2来替代,则这种情况文件情况是:
A1 不等于 A2
B1 就是 B2,实际上只有一份B!
这时候文件的访问路径其实有两条,通过A1 --> B,或者通过A2 --> B,最终都是访问B的数据(注意,B只有一份)
硬链接只能指向文件,不能指向目录。不能跨越任何文件系统。由于数据只有一份,所以即使删除其中任意一份(删除操作实际上只是删除文件的A部分),还是可以通过另外的路径访问。同时,不同的访问路径访问的是同样的数据,所以可以保证数据一直同步

快捷方式
通常是微软Windows的概念,理念上类似软连接,但是实际实现由于操作系统不同实现过程有很大差异。而快捷方式实际上是拥有lnk后缀的普通文件。文件夹快捷方式和文件的快捷实现不太一样,文件夹的快捷方式实际上是包含了部分文件的普通文件夹。

符号链接(不是连接),通常是软连接、硬连接、快捷方式等的总称。

比较这几个概念时:

首先,应该先排除副本,因为经过copy之后,文件内容也经过复制存储到到磁盘的其他位置了,副本和源文件已经没有任何联系了。

其次,从我看看的资料,符号链接和软链接是同一个概念,相当于Windows下的快捷方式。所以只剩下软链接和硬链接的区别。 这部分内容可以参考Linux下的链接文件

Linux中的链接文件分为两种:硬链接和软链接。软链接(symbolic link)很好理解,就是类似于Windows的快捷方式功能的文件,让你可以快速链接到目标文件(或目录);另一种是通过文件系统的inode链接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link)。

1. Hard link

在博客中EXT2/EXT3文件系统(一),我们知道:

  • 每个文件都会占用一个inode,文件内容由inode的记录来指向;
  • 想要读取该文件,必须经过目录记录的文件名来指向正确的inode号码才能读取。

也就是说,其实文件名只与目录有关,但是文件内容则与inode有关。那么,有没有可能多个文件名对应同一个inode呢?这就是所谓hard link的由来。简单地说:hard link只是记录某个目录下新建一条文件名连接到某inode号码的关联而已。

如果将读取数据的示意图画出,则如下:


上图的意思是:可以通过1或2的目录inode去找到两个不同的文件名,而不管使用哪个文件名均可以指到real那个inode去读取最终的数据。这样做的最大好处就是安全,如果你将一个文件名删除,其实inode与block都还是存在的。此时可以通过另一个“文件名”来读到正确的数据。此外,不论使用哪个“文件名”来编辑,最终的结果都会写入到inode与block中,因此均能对数据进行修改。

硬连接的基本特性与限制:

  • 使用hard link设置链接文件时,磁盘的空间与inode的数目都不会改变,只是在某个目录下的block多写入一条关联数据;
  • 不能跨文件系统;
  • 不能链接到目录。如果设置硬链接到目录,链接的数据需要连同目录下面的所有数据都建立链接,会造成相当大的复杂度,目前不支持。
2.symbolic link

symbolic link很好理解,就是新建了一个文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。由于只是作为指向的作用,所以,当源文件被删除后,symbilic link的文件会“开不了”,实际上就是找不到源文件“文件名”。下图为symbolic link文件读取示意图:

由1号inode读取到链接文件的文件内容只有文件名,根据文件名链接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了。

软链接文件的特点:

  • 软链接文件的重要内容就是它会写上目标文件的“文件名”。
  • 这个symbilic link和Windows的快捷方式可以划上等号,由symbolic link所创建的文件是一个独立的新文件,会占用inode与block。
  • hard link更安全,但限制多,所以symbolic link应用更广。

更详细的内容可以参见:Linux下的链接文件

把这里的inode看做你实际的文件信息.

我们可以看到硬链接和文件名都是直接指向文件的, 二者只是同一个文件的不同标签而已.

软链接是指向文件名的, 修改它并不会改变文件信息. 也就是我们常说的快捷方式.

至于副本, 把这张图复制一下, 两张并排一起看就好了.

desktop只是启动方式(只能通过参数来启动软件,作用有限)
副本就是两个独立的文件,占用两个文件的大小

软链接就是真正意义上的快捷方式,比如指向任何文件夹或这文件
硬链接就是一个文件(不是文件夹)的别名,无论有多少各别名,但它其实 是一个文件

---------------
再啰嗦一遍:
对我来说,软硬链接只是为了防止文件不小心被删,
比如我将一个名为知乎笔记.txt从/home/XX/笔记硬链接到/home/XX/桌面,
编辑桌面的知乎笔记.txt时 笔记下的知乎笔记.txt已同步更新了
即使不小心把桌面上的知乎笔记.txt删了, /home/XX/笔记里的知乎笔记.txt还在

你可能会说为什么不直接复制知乎笔记.txt呢?
复制要占两个大小啊,而且复制了,你编辑了一个,另一个它不同步啊


再说说同步吧,
linux下没有onenote,zim虽然简单也足够了
用cryptkeeper设置一个加密文件夹,(注意是实际加密的那个,不是映射的那个,切记)
在金山快盘里将该加密文件夹设置为自动同步,既方便,又安全
说一个 Windows 下的一个有用的区别,
Windows 下快捷方式只能使用绝对路径,这导致移动硬盘、U盘里的快捷方式如果盘符改变了(比如 F:\ 变成了 G:\),就失效了。
而使用符号连接(mklink 命令创建的)就可以在改变了盘符的情况下继续有效。
看到这个问题,我回去研究了一下,这里就说一下linux系统ubuntu发行版的情况。
受条件所限,手头只有ubuntu的系统,那位大能能够多研究几个系统然后弄一个完整的答案?
========================================
ubuntu的yelp.desktop是一个快捷方式,本质上是一个文本文件。
$ cat yelp.desktop
[Desktop Entry]
Name=Help
Comment=Get help with Unity
Keywords=documentation;information;manual;
OnlyShowIn=GNOME;Unity;
Exec=yelp %u
Icon=help-browser
StartupNotify=true
Terminal=false
Type=Application
Categories=GNOME;GTK;Core;Documentation;Utility;
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=Yelp
X-GNOME-Bugzilla-Component=general
X-GNOME-Bugzilla-Version=3.10.2
MimeType=x-scheme-handler/ghelp;x-scheme-handler/help;x-scheme-handler/info;x-scheme-handler/man;
X-Ubuntu-Gettext-Domain=yelp
==========================================================
而.desktop在ubuntu中被成为desktop configeration file,包含了很多参数,点开他的属性发现他和windows的.link文件一样都包含命令行参数。他们和各种链接都不同,因为他们本身能够携带各种参数,是包含指向功能的配置文件。
软链接是一个二进制文件,我不知道他的组成是什么,因为看不到。但是依据书上的知识来看,他其中包含了指向源程序的路径,独立于源文件存在,创建了一个文件夹的软链接之后,点进去会发现,他就像是完成了一个挂载操作一样,进入了一个软链接命名的文件夹中,好似这个文件夹真的存在一样,但实际上他是进入了系统另一个路径中。
硬链接实际上是一个指针,他本身不是文件,至少不是一般意义上的文件。学过C 语言的应该能够理解。
符号链接没接触过不做评价。不过至少从表现上来看,和软链接是一样的。
副本和源文件是两个东西。没什么联系。

我也在学习这几个链接,在win7里刚才试了下。使用的是Link Shell Extension.

目录链接和符号链接,都是指向源的记录,应该是软连接的一种,但在拷贝剪切时发生了不同的作用。拷贝时二者都是复制了源,也就是拷贝了真实的文件和目录,但在剪切时符号链接仅仅剪切了符号自身,而目录链接则直接剪切了源,剪切后目录链接自身不会被删除。由于源被剪切了,所以原来的目录链接指向的目录没有了内容。

------------------------------------------------------------------------------------

修订:

其实讨论应该看是哪个系统,有共同点也有不同的地方。基本上只有硬链接和软链接,硬链接就是对文件inode的引用,多一个硬连接就多一个引用,其文件实体本身只有一份。建立硬连接后,无论是最开始的文件还是最后建立的硬连接都是平等的文件,看不出谁是源谁是硬连接。如果要删除文件,只有所有的硬连接都删除才会最终删除文件实体,也就是inode的引用为0才会删除文件本身。硬连接限于同一个drive,移动任何一个都不会影响其他硬连接。

软连接有自己的inode,文件内容是关于源的引用信息,也就是说软连接的内容和源文件的内容是不同的,只不过软连接的文件内容很小,是一些关于源的说明信息,系统可以从软连接直接访问源文件。当源被移动、修改文件名称、删除后,软连接的引用信息不会自动更新同步,成了悬浮信息,软连接也就失效了。软连接可以跨drive。

windows7还有个链接叫做目录链接,其实是翻译的问题,原文是junction,这个我没有了解。可能是杂糅了硬连接和软连接的一些功能而成。

通俗地说,软连接有点像快捷方式,硬连接则是同一个文件的不同叫法。

为什么有这么多类型?
这些类型的目的无非是两个:
方便:你可以将任意程序的快捷方式放到桌面,而不用重重点击。我可以将 ~/dev/myproject/.oOo./.zshrc 软链接到 ~/.zshrc,从而统一管理我的配置文件。
节省资源:除了 copy 之外,剩下 4 种类型都不会额外消耗硬盘空间。

分别怎么使用?
如果是普通用户,你只需要知道「快捷方式」和「副本」之间的区别,后者是完全独立的复制。
如果是开发者的话,我相信去 wikipedia 搜索定义即可,看到不会的名词再多点一次。
来自 https://www.zhihu.com/question/20729978

发表于: 2013-05-20 17:08:14 楼主回复次数:14
回复于: 2013-05-20 17:27:49#1 得分:0
 
回复于: 2013-05-21 08:48:43#2 得分:0
 
回复于: 2013-05-21 09:09:56#3 得分:0
 
回复于: 2013-05-21 09:14:37#4 得分:0
 
回复于: 2013-05-21 22:44:18#5 得分:0
 
回复于: 2013-05-21 22:44:51#6 得分:0
 
回复于: 2013-05-22 08:50:10#7 得分:0
 
回复于: 2013-05-24 14:56:06#8 得分:0
 
回复于: 2013-05-27 23:12:58#9 得分:0
 
回复于: 2013-06-03 16:15:01#10 得分:0
 
回复于: 2013-06-11 16:00:38#11 得分:0
 
回复于: 2013-06-19 21:45:57#12 得分:0
 
回复于: 2013-10-06 18:09:36#13 得分:0
 
来自 http://bbs.csdn.net/topics/390464828
普通分类: