本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。

为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅。

===

[正文开始]

ln是一个很神奇的命令,它可以创建一个文件的影子,也可以通过一个通道进入另一个地方。:)其实,所有的这些把戏都是通过软连接和硬连接实现的。

我们假设你已经阅读了“硬连接和软连接的原理-《别怕Linux编程》之七”这篇文章,并且对其原理有比较透彻的认识。下面开始ln命令的情景举例吧!

1 我想建一个source.txt文件的硬链接,名字取做linksource.txt

[rocrocket@wupengchong test]$ cat source.txt
Hello!Source!
[rocrocket@wupengchong test]$ ll source.txt
-rw-rw-r– 1 rocrocket rocrocket 14 2008-10-23 09:25 source.txt
[rocrocket@wupengchong test]$ ln source.txt linksource.txt
[rocrocket@wupengchong test]$ ll -i source.txt linksource.txt
1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 linksource.txt
1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

可以看到,我们建立硬链接的命令格式是“ln 目标 链接名称”,我们用ln source.txt
linksource.txt来建立了一个source.txt文件的硬链接。之后,我们用ll -i,即ls
-li命令来查看了文件的信息,其中-i选项表示列出每个文件的inode节点ID,我们可以发现source.txt和linksource.txt的
inode号是完全一样的,都是1178119,这就说明它们都指向同一个数据块。这就是硬链接。

但要注意,硬链接不允许跨分区来建立,也就是不允许跨文件系统来建立,即使是同一类型的文件系统也是不行的。所以硬链接只能在一个分区内建立。

2 我想建立一个source.txt文件的软链接,名字叫做softsource。

[rocrocket@wupengchong test]$ ln -s source.txt softsource
[rocrocket@wupengchong test]$ ll -i source.txt softsource
1178211 lrwxrwxrwx 1 rocrocket rocrocket 10 2008-10-23 09:32 softsource -> source.txt
1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

可以看到,建立软链接也是使用ln命令,但是必须加上-s选项,建立软链接的命令格式为“ln -s 目标
链接名称”。之后我们可以使用ls命令可以查看到软链接softsource和source.txt的inode号是不一样的,这说明他们完全指向两个不
同的数据库快。而且,细心的朋友能够观察到软链接文件的权限栏首字符为l,这也是软链区别于普通文件的地方之一。

如果这个时候,我们删除了source.txt文件,则软链接softsource就会编程红色字体,这表示警告,这是一个有问题的文件,它无法找到它所标识的文件source.txt了。

3 刚才的两个例子都是链接文件的,那链接目录呢,我想试试!

[rocrocket@wupengchong test]$ ln tempdir linkdir
ln: `temp': hard link not allowed for directory

我想硬链接一个目录tempdir,但是报错了!是的,硬链接是不允许链接到目录的。(待会儿来分析原因,少安毋躁)

[rocrocket@wupengchong test]$ ln -s temp linkdir

目录的软链接的建立是允许的,看,我建立了一个temp目录的软链接linkdir,以后我完全可以cd linkdir来进入temp目录了。像这样:

[rocrocket@wupengchong test]$ cd linkdir/
[rocrocket@wupengchong linkdir]$ ls
a001.txt  a002.c  a.out  sixunhuan.c
[rocrocket@wupengchong linkdir]$ cd ../temp/
[rocrocket@wupengchong temp]$ ls
a001.txt  a002.c  a.out  sixunhuan.c
[rocrocket@wupengchong temp]$

我们来查看下这两个目录的属性信息:

[rocrocket@wupengchong test]$ ll|grep -E “temp|linkdir”
lrwxrwxrwx 1 rocrocket rocrocket     4 2008-10-23 09:49 linkdir -> temp
drwxr-xr-x 2 rocrocket rocrocket  4096 2008-08-07 16:08 temp

可以看到linkdir是软链接,而temp是一个目录。

4 为什么ln不允许硬链接到目录,而允许软链接到目录呢?

这个问题,我在网上找到了很好的解答。这位朋友解释的很清晰。(我实在无法找到如下文章的出处以及原作者信息,故无法标识原作者信息,如有知情者,可速与我联系,我会及时加入作者信息。谢谢)

“linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作
硬连接。至于第一个限制,很好理解,而第二个就不那么好理解了。 我们对任何一个目录用ls -l
命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d
也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进
行限制呢?

如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会
陷入无限循环当中。也许您会说,符号连接不也可以引入循环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文
件)都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可
以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录
符号连接不会进入死循环的原因了。但是对于硬连接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。”

5 ln命令里面有一个-n选项,它的官方解释是这样的:-n, –no-dereference  treat
destination that is a symlink to a directory as if it were a normal
file. 请问这是什么意思阿?

在水木上有类似的一个帖子,jianingy给出了一个清晰的例子,如下:

第一步:mkdir a b
第二步:ln -sf a c (这个时候c -> a)
第三步:如果执行ln -sf b c,那么会在c目录“里面”创建一个b的symbolic link,但很明显这不是你的本意。
如果把第三步替换成:ln -snf b c 那么结果就变成了c->b

《ln命令》-linux命令五分钟系列之十八的更多相关文章

  1. 《作业控制系列》-“linux命令五分钟系列”之十

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  2. 《man男人》-linux命令五分钟系列之十五

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  3. 《cut命令》-linux命令五分钟系列之十九

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  4. 《用chsh选择shell》-linux命令五分钟系列之十二

    chsh命令用于修改你的登录shell. 1 我想知道我机器安装了哪些shell? 两种方法可以查看: 第一种: [rocrocket@wupengchong ~]$ chsh -l /bin/sh ...

  5. 《sed的流艺术之一》-linux命令五分钟系列之二十一

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  6. 《paste命令》-linux命令五分钟系列之二十

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  7. 《sed的流艺术之四》-linux命令五分钟系列之二十四

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  8. 《sed的流艺术之三》-linux命令五分钟系列之二十三

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  9. 《sed的流艺术之二》-linux命令五分钟系列之二十二

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

随机推荐

  1. stuff about set multiset map multimap

    A lot of interviewers like to ask the candidates the difference between set and multiset(map and mul ...

  2. php 环境变量收集

    常用的PHP环境变量和系统常量列表 是一个包含服务器端相关信息的PHP全局环境变量,在PHP4.1.0之前的版本使用$HTTP_SERVER_VARS.更多信息可以参考这里. $_SERVER['PH ...

  3. ffmpeg的logo, delogo滤镜参数设置

    FFmpeg的添加logo,去logo滤镜的组合共有三种方式: 1. 只有添加logo滤镜 $ ./ffmpeg -i INPUT.FLV  \ -vf movie=/opt/logo.png[log ...

  4. gitbook 制作 beego 参考手册

    安装gitbook工具 npm install -g gitbook-cli 从github 下载beego文档 https://github.com/beego/beedoc 创建目录 在 zh-c ...

  5. ctrl+z的JAVA实现,借助了命令模式(command pattern)

    前些天学习<<JAVA与模式>>,到命令模式时,随带给了一个CTRL+Z案例的实现,想来学习编程这么久,CTRL+Z还没有认真实现过. 因此,借助JAVA与模式里面的源代码,自 ...

  6. 【转】国内较快的maven镜像

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...

  7. 解析xlsx文件---Java读取Excel2007

    关于Java读取Excel2007的文章在Google.百度上搜索一下,没有太好的例子,实现的也不算太好.查看了一下Poi,最新的 POI 3.5 beta 4 支持读写 Excel2007和PPT2 ...

  8. PHP中输出缓冲

    在PHP中,当运行echo,print的时候,输出并没有马上通过tcp传给client浏览器显示, 而是将数据写入php buffer.php output_buffering机制,意味在tcp bu ...

  9. jdk和jre是什么?都有什么用?(转帖)

    jdk和jre是什么?都有什么用?(转帖) 文章分类:Java编程 大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做.由于这样更能帮助大家弄清楚它们的差别: ...

  10. BTrace: DTrace for Java

    BTrace: DTrace for Java… ish DTrace first peered into Java in early 2005 thanks to an early prototyp ...