1. 苏葳的备忘录首页
  2. 操作系统

Linux下ln/ln -s/cp/cp -s的区别

linux unix ln最初Dos下用md命令创建的文件系统对象也称为“目录”,然后到了Windows时代之后就改名叫“文件夹”了。这种命名的改变使得微软的操作系统对消费用户而言更具有亲和力。而对走冷艳路线的Unix而言,文件的结构与win下并无本质上的区别,也是由文件名,inode(大约相当于win下的FCB文件控制块,保存文件的一些信息)以及数据组成。但独具特色的“链接”概念比起windows的“快捷方式”就要复杂的多了。

首先在RHEL 5.5下创建个内容为aaaa的文件:

echo "aaaaaa" >origin

然后执行:

 ls –i origin

44892210 origin

前面数字即为origin文件的inode号。再执行:

ln origin ln_origin

执行:

ls –i ln_origin:

44892210 ln_origin

可以看到 硬链接ln_origin具有同原文件相同的inode号,即是说,ln硬链接是将文件名指向了与原文件相同的inode,所以最省空间。

ln -s origin ln_s_origin

执行:

ln –i ln_s_origin:

44892273 ln_s_origin

可以看到,ln –s 符号链接是拷贝了一份原文件inode,并将inode中的数据块指向原文件的数据块。与ln相比,增加了一个inode占用的空间。

那么cp -s呢

cp –s origin cp_s_origin

然后:

ln –i cp_s_origin

 

44892274 cp_s_origin

可以看到cp –s 创建了一个类似与ln -s的符号链接,同样复制了新的inode。

若修改ln_s_origin的内容,可以看到origin/cp_s_origin/ln_s_origin三个文件同步发生了改变。可见cp -s与ln -s在文件操作时应该是一样的。这恐怕也是aix等系统未提供cp -s参数的原因。而ln -s还可以为目录创建符号链接,cp -s则不行,这也许是cp –s 与ln -s的主要区别吧。

cp命令没有疑义,不需多说了。

现在把origin文件删除,看会发生什么情况。

rm origin

此时,file ln_s_origin或cp_s_origin,均会出现

ln_s_origin: broken symbolic link to `origin'

的提示。

但ln_origin则可正常编辑使用。

可见ln硬链接后,删除origin文件时,只是删除其一个引用计数,只有引用计数减为0时,才会真正删除文件。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/535.html

发表评论

邮箱地址不会被公开。 必填项已用*标注