本原创文章属于《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. Bzoj 2749: [HAOI2012]外星人 欧拉函数,数论,线性筛

    2749: [HAOI2012]外星人 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 568  Solved: 302[Submit][Status][ ...

  2. 利用checkinstall制作deb或rpm工具包

    1. 概述 有时候我们向用户提供软件时,并不希望提供源码(虽然这挺狗的...),而是只希望提供一些可执行文件.小程序还好说,可以轻易地提取有用的信息出来. 但对于一些比较庞大的程序,尤其是需要配置文件 ...

  3. Java中url传递中文参数取值乱码的解决方法

    java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...

  4. SpringMVC 测试 mockMVC

    SpringMVC测试框架 基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试. 一 MockMvcBui ...

  5. https_request请求接口返回数据

    定义一个https_request方法 <?php function https_request($url, $data = null) { $curl = curl_init(); curl_ ...

  6. [Oracle] - 性能优化工具(1) - AWR

    AWR快照 默认情况下,Oracle每隔一小时会自己主动产生一个快照,保存近期8天的快照. 我们能够通过例如以下语句获得产生快照的时间间隔和保存的天数: SYS@orcl(lx15)> sele ...

  7. Decode Ways -- LeetCode

    原题链接: http://oj.leetcode.com/problems/decode-ways/  这道题要求解一个数字串依照字符串编码方式可解析方式的数量.看到这样的求数量的,我们非常easy想 ...

  8. [ORACLE]数据库之间复制表

    ---------------------------------------------------------------------------- -------------ORACLE数据库管 ...

  9. Android之PreferenceActivity 详解

    看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找. PerferenceActivity是什么,看下面的截图: ...

  10. uva 167 - The Sultan&#39;s Successors(典型的八皇后问题)

    这道题是典型的八皇后问题,刘汝佳书上有具体的解说. 代码的实现例如以下: #include <stdio.h> #include <string.h> #include < ...