当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : ln -s ./a ./b/a
帖子发表于 : 2009-03-28 2:16 
头像

注册: 2007-12-05 12:25
帖子: 1153
送出感谢: 0 次
接收感谢: 0 次
:em20

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

代码:
ln -s ./a ./b/a


这样为什么不行?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-03-28 2:28 
头像

注册: 2008-12-13 19:39
帖子: 13284
地址: 物华天宝人杰地灵
送出感谢: 1
接收感谢: 6
把第2个目录下的次目录改成A试下! :em02


_________________
行到水穷处,坐看云起时。
海内生明月,天涯共此夕。
--------------------吾本独!


页首
 用户资料  
 
3 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-04-04 12:19 
头像

注册: 2007-12-05 12:25
帖子: 1153
送出感谢: 0 次
接收感谢: 0 次
为了这个问题,我仔细看了一下文件系统的原理,明白了不少知识。
: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 次

页首
 用户资料  
 
4 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-04-04 12:28 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
输出什么错误

其实你是不是想做这个
ln -s ../a ./b/a


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-04-04 12:30 
头像

注册: 2007-12-05 12:25
帖子: 1153
送出感谢: 0 次
接收感谢: 0 次
BigSnake.NET 写道:
输出什么错误

其实你是不是想做这个
ln -s ../a ./b/a


记得当时没有错误,就是链接之后不能用,ls出来是红色的,其实就是没有找到目标。。。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-04-04 12:37 
头像

注册: 2007-03-02 17:36
帖子: 7259
送出感谢: 3
接收感谢: 97
ln -s ./a ./b/a
效果就是b目录下有一个连接a,连接到./a也就是“当前目录下的a目录”这个“当前目录”可并不是你输命令时候的当前目录,而是连接所在的“当前目录”,就是说,你创建的连接文件在./b目录,那么这个./就代表./b目录,b目录里建a连接连接到a,当然有问题。所以,其实应该像4楼那样
ln -s ../a ./b/a

不知道说明白没有


_________________
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事


页首
 用户资料  
 
7 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-04-04 12:41 
头像

注册: 2007-12-05 12:25
帖子: 1153
送出感谢: 0 次
接收感谢: 0 次
懒蜗牛Gentoo 写道:
ln -s ./a ./b/a
效果就是b目录下有一个连接a,连接到./a也就是“当前目录下的a目录”这个“当前目录”可并不是你输命令时候的当前目录,而是连接所在的“当前目录”,就是说,你创建的连接文件在./b目录,那么这个./就代表./b目录,b目录里建a连接连接到a,当然有问题。所以,其实应该像4楼那样
ln -s ../a ./b/a

不知道说明白没有


这个现在我明白了,提问的时候是不懂。

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

:em11 :em11


页首
 用户资料  
 
8 楼 
 文章标题 : Re: ln -s ./a ./b/a
帖子发表于 : 2009-04-04 13:34 
头像

注册: 2008-07-21 9:44
帖子: 2371
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
:em05 :em05
学习了,这个“链接”所牵涉到的知识可真多,有时还绕来绕去的,很容易就困惑了~~ :em06


_________________

My blog


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译