Linux中的ln-创建链接

ln 命令既可创建硬链接,也可以创建符号链接。可以用其中一种方法来使用它:

创建硬链接 ln file link,和创建符号链接 ln -s item link,“item”是一个文件或者是一个目录。

硬链接

硬链接和符号链接比起来,硬链接是最初Unix 创建链接的方式,而符号链接更加现代。在默认情况下,每个文件有一个硬链接,这个硬链接给文件起名字。当我们创建一个硬链接以后,就为文件创建了一个额外的目录条目。硬链接有两个重要局限性:

1. 一个硬链接不能关联它所在文件系统之外的文件。这是说一个链接不能关联与链接本身不在同一个磁盘分区上的文件。

2. 一个硬链接不能关联一个目录。

一个硬链接和文件本身没有什么区别。不像符号链接,当你列出一个包含硬链接的目录内容时,你会看到没有特殊的链接指示说明。当一个硬链接被删除时,这个链接被删除,但是文件本身的内容仍然存在(这是说,它所占的磁盘空间不会被重新分配),直到所有关联这个文件的链接都删除掉。知道硬链接很重要,因为你可能有时会遇到它们,但现在实际中更喜欢使用符号链接,下一步我们会讨论符号链接。

符号链接

创建符号链接是为了克服硬链接的局限性。符号链接生效,是通过创建一个特殊类型的文件,这个文件包含一个关联文件或目录的文本指针。在这一方面,它们和 Windows 的快捷方式差不多,当然,符号链接早于 Windows 的快捷方式很多年。一个符号链接指向一个文件,而且这个符号链接本身与其它的符号链接几乎没有区别。例如,如果你往一个符号链接里面写入东西,那么相关联的文件也被写入。然而,当你删除一个符号链接时,只有这个链接被删除,而不是文件自身。如果先于符号链接删除文件,这个链接仍然存在,但是不指向任何东西。在这种情况下,这个链接被称为坏链接。在许多实现中,ls命令会以不同的颜色展示坏链接,比如说红色,来显示它们的存在。关于链接的概念,看起来很迷惑,但不要胆怯。我们将要试着练习这些命令,希望,它变得清晰起来。

下面来看一个例子,首先在家目录里创建一个叫做“playground”的目录。

创建目录:[me@linuxbox ~]$ mkdir playground

在playground 目录下创建一对目录,分别叫做“dir1”和“dir2”。更改我们的当前工作目录到playground,然后执行mkdir 命令:

[me@linuxbox ~]$ cd playground
[me@linuxbox playground]$ mkdir dir1 dir2

在 playground 目录中创建一个fun文件和一个fun 目录:[me@linuxbox playground]$ mkdir fun

创建硬链接

现在,我们试着创建链接。首先是硬链接。我们创建一些关联我们数据文件的链接:

[me@linuxbox playground]$ ln fun fun-hard

[me@linuxbox playground]$ ln fun dir1/fun-hard

[me@linuxbox playground]$ ln fun dir2/fun-hard

所以现在,我们有四个文件“fun” 的实例。看一下目录playground 中的内容:

[me@linuxbox playground]$ ls -l
total 16
drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir1

drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir2
-rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun
-rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun-hard

注意到一件事,列表中,文件fun 和fun-hard 的第二个字段是“4”,这个数字是文件“fun”的硬链接数目。你要记得一个文件至少有一个硬链接,因为文件名就是由链接创建的。所以,我们怎样知道实际上fun 和fun-hard 是一样的文件呢?在这个例子里,ls 不是很有用。虽然我们能够看到fun 和fun-hard 文件大小一样(第五字段),但我们的列表没有提供可靠的信息来确定(这两个文件一样)。为了解决这个问题,我们更深入的研究一下。当考虑到硬链接的时候,我们可以假设文件由两部分组成:包含文件内容的数据部分和持
有文件名的名字部分,这将有助于我们理解这个概念。当我们创建文件硬链接的时候,实际上是为文件创建了额外的名字部分,并且这些名字都关系到相同的数据部分。这时系统会分配一连串的磁盘给所谓的索引节点,然后索引节点与文件名字部分相关联。因此每一个硬链接都关系到一个具体的包含文件内容的索引节点。ls 命令有一种方法,来展示(文件索引节点)的信息。在命令中加上“-i” 选项:

[me@linuxbox playground]$ ls -li
total 16
12353539 drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir1
12353540 drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir2
12353538 -rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun
12353538 -rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun-hard

在这个版本的列表中,第一字段表示文件索引节点号,正如我们所见到的,fun 和fun-hard 共享一样的索引节点号,这就证实这两个文件是一样的文件。

创建符号链接

建立符号链接的目的是为了克服硬链接的两个缺点:硬链接不能跨越物理设备,硬链接不能关联目录,只能是文件。符号链接是文件的特殊类型,它包含一个指向目标文件或目录的文本指针。
符号链接的建立过程相似于创建硬链接:

[me@linuxbox playground]$ ln -s fun fun-sym
[me@linuxbox playground]$ ln -s ../fun dir1/fun-sym
[me@linuxbox playground]$ ln -s ../fun dir2/fun-sym

第一个实例相当直接,在ln 命令中,简单地加上“-s” 选项就可以创建一个符号链接,而不是一个硬链接。下面两个例子又是怎样呢?记住,当我们创建一个符号链接的时候,会建立一个目标文件在哪里和符号链接有关联的文本描述。如果我们看看ls 命令的输出结果,比较容易理解。

[me@linuxbox playground]$ ls -l dir1
total 4
-rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun-hard
lrwxrwxrwx 1 me me 6 2008-01-15 15:17 fun-sym -> ../fun

目录dir1 中,fun-sym 的列表说明了它是一个符号链接,通过在第一字段中的首字符“l”可知,并且它还指向“../fun”,也是正确的。相对于fun-sym 的存储位置,fun 在它的上一个目录。同时注意,符号链接文件的长度是6,这是字符串“../fun” 所包含的字符数,而不是符号链接所指向的文件长度。
当建立符号链接时,你即可以使用绝对路径名:

ln -s /home/me/playground/fun dir1/fun-sym

也可用相对路径名,正如前面例题所展示的。使用相对路径名更令人满意,因为它允许一个包含符号链接的目录重命名或移动,而不会破坏链接。
除了普通文件,符号链接也能关联目录:

[me@linuxbox playground]$ ln -s dir1 dir1-sym
[me@linuxbox playground]$ ls -l
total 16
... 省略

移动文件和目录

正如我们之前讨论的,rm 命令被用来删除文件和目录。首先,删除一个硬链接:

[me@linuxbox playground]$ rm fun-hard
[me@linuxbox playground]$ ls -l
total 12
... 省略

结果不出所料。文件fun-hard 消失了,文件fun 的链接数从4 减到3,正如目录列表第二字段所示。下一步,我们会删除文件fun,仅为了娱乐,我们会包含“-i” 选项,看一个它的作用:

[me@linuxbox playground]$ rm -i fun
rm: remove regular file `fun'?

在提示符下输入“y”,删除文件。让我们看一下ls 的输出结果。注意,fun-sym 发生了什么事? 因为它是一个符号链接,指向已经不存在的文件,链接已经坏了:

[me@linuxbox playground]$ ls -l
total 8
drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir1
lrwxrwxrwx 1 me me 4 2008-01-16 14:45 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir2
lrwxrwxrwx 1 me me 3 2008-01-15 15:15 fun-sym -> fun

大多数Linux 的发行版本配置ls 显示损坏的链接。在Fedora 系统中,坏的链接以闪烁的红色文本显示!损坏链接的出现,并不危险,但是相当混乱。如果我们试着使用损坏的链接,会看到以下情况:

[me@linuxbox playground]$ less fun-sym
fun-sym: No such file or directory

稍微清理一下现场。删除符号链接:

[me@linuxbox playground]$ rm fun-sym dir1-sym
[me@linuxbox playground]$ ls -l
total 8
drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir1
drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir2

对于符号链接,有一点值得记住,执行的大多数文件操作是针对链接的对象,而不是链接本身。而rm 命令是个特例。当你删除链接的时候,删除链接本身,而不是链接的对象。最后,我们将删除 playground。为了完成这个工作,我们将返回到我们的家目录,然后用rm 命令加上选项(-r),来删除目录playground,和目录下的所有内容,包括子目录:

[me@linuxbox playground]$ cd
[me@linuxbox ~]$ rm -r playground

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值