本原创文章属于《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. vim spf13

    效果图来一个: http://vim.spf13.com/ 这个网站里面的vim配置非常全,推荐. 下面是对这个vim快捷键总结: <Leader> 是"," 打卡一个 ...

  2. rtsp的东西

    http://ubuntuforums.org/showthread.php?t=1544946 http://www.live555.com/liveCaster/liveInput.html ht ...

  3. Compress、tar、gzip、zcat、bzip2、bzcat、打包解压命令行

    讲解内容: Linux环境中,压缩文件案的扩展名大多是*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.bz2. *.z             compress程序亚索的文件: *.g ...

  4. Using OpenCV with gcc and CMake

    Using OpenCV with gcc and CMake Note We assume that you have successfully installed OpenCV in your w ...

  5. UVA 10557 XYZZY

    Problem D: XYZZY ADVENT: /ad�vent/, n. The prototypical computer adventure game, first designed by W ...

  6. table 的thead th 固定 tbody滚动例子

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. EXCEL 2010学习笔记—— 动态图表

    今天梳理一下动态图表的相关内容,做一个简单的整理 关键的操作点: 1.插入动态控制器:开发工具->插入->表单控件 对控件进行修改  右键 设置控件格式->单元格链接 用来作为if ...

  8. BOM、DOM学习笔记——JavaScript

    1.BOM的概述    browser object modal :浏览器对象模型.    浏览器对象:window对象.    Window 对象会在 <body> 或 <fram ...

  9. PHP文件操作常用函数总结

    一 .解析路径: 1 获得文件名: basename(); 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名.如果文件名是以 suffix 结束的,那这一部分也会被去掉. eg: $ ...

  10. Linux下源码安装Nginx服务

    nginx 安装 linux 系统需要安装必备的开发包,比如 gcc,gcc-c++     1. openssl (支持 https) https://www.openssl.org/source/ ...