ln -s ./a ./b/a

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
darasion
帖子: 1153
注册时间: 2007-12-05 12:25

ln -s ./a ./b/a

#1

帖子 darasion » 2009-03-28 2:16

:em20

当前目录下有2个目录,分别是a,b。

代码: 全选

ln -s ./a ./b/a
这样为什么不行?
头像
wangdu2002
帖子: 13284
注册时间: 2008-12-13 19:39
来自: 物华天宝人杰地灵

Re: ln -s ./a ./b/a

#2

帖子 wangdu2002 » 2009-03-28 2:28

把第2个目录下的次目录改成A试下! :em02
行到水穷处,坐看云起时。
海内生明月,天涯共此夕。
--------------------吾本独!
头像
darasion
帖子: 1153
注册时间: 2007-12-05 12:25

Re: ln -s ./a ./b/a

#3

帖子 darasion » 2009-04-04 12:19

为了这个问题,我仔细看了一下文件系统的原理,明白了不少知识。
:em11

现在按照我的理解是这样的:

目录或文件是由一个inode及其指向的一堆block组成,其中这个inode记录着这个目录或文件的存取模式(read/write/excute)、所属用户和组、占用空间大小、创建或状态改变时间(ctime)、读取时间(atime)、修改时间(mtime)、特殊属性(SetUID/SetGID/Sticky Bit等)和指向block的指针组成。

目录的inode指向的这一堆block记录了该目录的下的文件或目录的名字和这些名字对应的inode。而该目录的名字则是由它的上层目录的block记录。

文件的inode指向的这一堆block记录了文件的实际数据。

符号链接(symbolic link)实际上是一个记录目录路径的文件,如同windows里的快捷方式,也就是说如果我在当前目录下建立了一个符号链接,那么当前目录的block区域记录着这个符号链接的名字和inode号码。这个inode指向一块记录着链接目标路径的一堆block。

如果我在做符号链接的时候,目标用相对路径,那么这个符号链接文件的这一堆block中记录的就是这个目标的相对于当前目录的路径。当使用这个符号链接时,系统却是由链接文件所在的目录开始找起。如果建立链接时的当前目录和链接文件所在目录不一致,那么就会找不到目标文件。因此,在作符号链接的时候,目标尽量使用绝对路径。

硬链接(hard link)不是文件,而是同一个文件的另一个文件名,硬链接和同一个文件的文件名之间没有任何区别。
具体来说,就是目录的block记录着很多文件名,而硬链接就是不同的两个文件名指向了同一个的文件的inode。不同的地方保存不同的文件名,而实际文件只有一份,不同的名字之间是同等的。

不同的文件系统之间inode号码是可以重复的,因此,硬链接不能建立在不同的文件系统之间,不同的分区之间不能建立硬链接。
目录也有硬链接,典型的就是代表当前目录的一点 . 和代表上层目录的两点 .. ,当建立一个目录的时候,新建目录的硬链接数至少是2,因为除了目录本身的名字外,在这个目录的里边还建立了一个点.的硬链接。建立了一个目录,则包含该目录的上层目录的硬链接数+1,新建目录中建立了他上层目录的硬链接两点.. 。

但是用ln命令不允许建立目录的硬链接,这是因为,硬链接和文件名是同等的,并不是像符号链接那样是文件。在文件系统的处理上跟普通的目录一模一样,如果可以随便建立目录的硬链接,那么就会破坏目录的树型结构,变成了网状结构了,这样会大大增加文件系统处理的复杂程度。尤其是处理递归删除或查找的时候,如果目录a中有一个链接着b的硬链接,目录b中又有一个链接着a的硬链接,递归就不能达到边界条件了。
符号链接则不同,因为符号链接和真正的文件名是有区别的,因此,符号链接作为文件来处理,不存在这种问题。也就是当我们删除符号链接的时候,默认不会追踪到链接目标;如果加上追踪选项(如find -L ),也可以通过符号链接是一个文件这个性质来判断是否进入死循环。

据说不能为目录建立硬链接还有另外一个原因,什么杂凑什么的,暂时还没看懂。。。。

:em20 :em20
上次由 darasion 在 2009-04-04 12:29,总共编辑 1 次。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: ln -s ./a ./b/a

#4

帖子 BigSnake.NET » 2009-04-04 12:28

输出什么错误

其实你是不是想做这个
ln -s ../a ./b/a
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
darasion
帖子: 1153
注册时间: 2007-12-05 12:25

Re: ln -s ./a ./b/a

#5

帖子 darasion » 2009-04-04 12:30

BigSnake.NET 写了:输出什么错误

其实你是不是想做这个
ln -s ../a ./b/a
记得当时没有错误,就是链接之后不能用,ls出来是红色的,其实就是没有找到目标。。。
头像
懒蜗牛Gentoo
论坛版主
帖子: 7353
注册时间: 2007-03-02 17:36
系统: Linux Mint

Re: ln -s ./a ./b/a

#6

帖子 懒蜗牛Gentoo » 2009-04-04 12:37

ln -s ./a ./b/a
效果就是b目录下有一个连接a,连接到./a也就是“当前目录下的a目录”这个“当前目录”可并不是你输命令时候的当前目录,而是连接所在的“当前目录”,就是说,你创建的连接文件在./b目录,那么这个./就代表./b目录,b目录里建a连接连接到a,当然有问题。所以,其实应该像4楼那样
ln -s ../a ./b/a

不知道说明白没有
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事
头像
darasion
帖子: 1153
注册时间: 2007-12-05 12:25

Re: ln -s ./a ./b/a

#7

帖子 darasion » 2009-04-04 12:41

懒蜗牛Gentoo 写了:ln -s ./a ./b/a
效果就是b目录下有一个连接a,连接到./a也就是“当前目录下的a目录”这个“当前目录”可并不是你输命令时候的当前目录,而是连接所在的“当前目录”,就是说,你创建的连接文件在./b目录,那么这个./就代表./b目录,b目录里建a连接连接到a,当然有问题。所以,其实应该像4楼那样
ln -s ../a ./b/a

不知道说明白没有
这个现在我明白了,提问的时候是不懂。

为了这个我查了好多东西,明白不少,正如我在3楼写的一样,呵呵。

:em11 :em11
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
联系:

Re: ln -s ./a ./b/a

#8

帖子 Jarson » 2009-04-04 13:34

:em05 :em05
学习了,这个“链接”所牵涉到的知识可真多,有时还绕来绕去的,很容易就困惑了~~ :em06
回复