《ln命令》-linux命令五分钟系列之十八

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

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

===

[正文开始]

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

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

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

[[email protected] test]$ cat source.txt
Hello!Source!
[[email protected] test]$ ll source.txt
-rw-rw-r– 1 rocrocket rocrocket 14 2008-10-23 09:25 source.txt
[[email protected] test]$ ln source.txt linksource.txt
[[email protected] 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。

[[email protected] test]$ ln -s source.txt softsource
[[email protected] 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 刚才的两个例子都是链接文件的,那链接目录呢,我想试试!

[[email protected] test]$ ln tempdir linkdir
ln: `temp‘: hard link not allowed for directory

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

[[email protected] test]$ ln -s temp linkdir

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

[[email protected] test]$ cd linkdir/
[[email protected] linkdir]$ ls
a001.txt  a002.c  a.out  sixunhuan.c
[[email protected] linkdir]$ cd ../temp/
[[email protected] temp]$ ls
a001.txt  a002.c  a.out  sixunhuan.c
[[email protected] temp]$

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

[[email protected] 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

时间: 2024-11-06 10:02:52

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

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

本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == 很久没发这个系列了.一直在看perl.现在回归.因为发现所有的脚本的基础都是linux命令… === 通俗的讲,作业控制命令是用来控制一个一个任务的. 1 我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行.因为我不想眼睁睁的看着机器建立索引,我还想编会儿程序呢: # updatedb &

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

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 大家在刚接触linux的时候,都会使用man来查阅一些命令的帮助信息.但是也都只是使用“man 命令名称”这样简单的格式.其实,man还有不少其他小技巧,在这和大家分享一下. 1 当你列出write时,它可能代表了Linux里的用户命令或系统调用,如果我只是想了解write这个系统调用的

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

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 1 一两句话描述一下cut命令吧! 正如其名,cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的. cut是以每一行为一个处理对象的,这种机制和sed是一样的.(关于sed的入门文章将在近期发布) 2 cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢

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

chsh命令用于修改你的登录shell. 1 我想知道我机器安装了哪些shell? 两种方法可以查看: 第一种: [[email protected] ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二种: [[email protected] ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/zsh 其实chsh -l也是来查看这个文件. 2 我想知道我当前正在使用的sh

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

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 在本系列上一篇文章中涉及到了cut命令(<cut命令>-linux命令五分钟系列之十九),本文章介绍的这个paste命令,是一个专门和cut对着干的命令,作用是将几个文件拼凑在一起. 1 paste的拼凑原理是什么? 这个很简单,和cut的原理几乎一样,就是将几个文件的相应行

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

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 1 你想过sed为什么叫sed么? sed是stream editor的缩写,sed就是一个流编辑器,说白了,就是我们往sed里输入一串信息,它给我们处理,然后输出来.就这么简单. sed和cut类似,是一个面向行处理的工具,它以“行”为处理单位,处理后的结果会输出到标准输出.所以说其实

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

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 上文接:<sed的流艺术之二>-linux命令五分钟系列之二十二 例五 给某些字符串后面插入些内容 [[email protected] programming]$ cat mysed.txt Beijing London[[email protected] programm

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

本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. === [正文开始] 上文接:<sed的流艺术之一>-linux命令五分钟系列之二十一 5 sed中有选项么?有没有什么比较常用的? sed最主要的就是command部分,把这部分玩转了,你就已经很厉害了,而玩转这部分的前提是玩转正则表达式.尽管如此,sed的选项部分的-n选项仍然是非常重要,理解

《vi中的替换艺术》-linux命令五分钟系列之十一

vi方面的内容不知道分类到哪里好,就放到<Linux命令五分钟系列>里吧! 今天编程,关于栈的一个小例子,其间我需要把”S.”替换为”S->”(替换不包括双引号). 其实这个不难,不过我觉得应该总结一下vi里的替换技术了,以备以后查阅. 1 所有替换方案都要在冒号“:”状态下书写. 2 如果想将abc替换为xyz,那么就这样 :s/abc/xyz/ 不过要特别注意,这个替换只局限于光标所在当前行,而且更糟糕的是它只替换当前行的第一个匹配项. 即,如果此行内容为I write abc, I