zoukankan      html  css  js  c++  java
  • 10.符号链接&创建链接

    在我们到处查看时,我们可能会看到一个目录,列出像这样的一条信息:

    lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
    

    注意看,为何这条信息第一个字符是“l”,并且有两个文件名呢? 这是一个特殊文件,叫做符号链接(也称为软链接或者 symlink )。 在大多数“类 Unix” 系统中, 有可能一个文件被多个文件名所指向。虽然这种特性的意义并不明显,但它真地很有用。

    描绘一下这样的情景:一个程序要求使用某个包含在名为“foo”文件中的共享资源,但是“foo”经常改变版本号。 这样,在文件名中包含版本号,会是一个好主意,因此管理员或者其它相关方,会知道安装了哪个“foo”版本。 这又会导致一个问题。如果我们更改了共享资源的名字,那么我们必须跟踪每个可能使用了 这个共享资源的程序,当每次这个资源的新版本被安装后,都要让使用了它的程序去寻找新的资源名。 这听起来很没趣。

    这就是符号链接存在至今的原因。比方说,我们安装了文件 “foo” 的 2.6 版本,它的 文件名是 “foo-2.6”,然后创建了叫做 “foo” 的符号链接,这个符号链接指向 “foo-2.6”。 这意味着,当一个程序打开文件 “foo” 时,它实际上是打开文件 “foo-2.6”。 现在,每个人都很高兴。依赖于 “foo” 文件的程序能找到这个文件,并且我们能知道安装了哪个文件版本。 当升级到 “foo-2.7” 版本的时候,仅添加这个文件到文件系统中,删除符号链接 “foo”, 创建一个指向新版本的符号链接。这不仅解决了版本升级问题,而且还允许在系统中保存两个不同的文件版本。 假想 “foo-2.7” 有个错误(该死的开发者!),那我们得回到原来的版本。 一样的操作,我们只需要删除指向新版本的符号链接,然后创建指向旧版本的符号链接就可以了。

    在上面列出的目录(来自于 Fedora 的 /lib 目录)展示了一个叫做 “libc.so.6” 的符号链接,这个符号链接指向一个 叫做 “libc-2.6.so” 的共享库文件。这意味着,寻找文件 “libc.so.6” 的程序,实际上得到是文件 “libc-2.6.so”。 

    硬链接

    讨论到链接问题,我们需要提一下,还有一种链接类型,叫做硬链接。硬链接同样允许文件有多个名字, 但是硬链接以不同的方法来创建多个文件名。

    创建链接

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

    ln file link
    

    创建硬链接,和:

    ln -s item link
    

    创建符号链接,”item” 可以是一个文件或是一个目录。

    硬链接

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

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

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

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

    ll命令输出的第二个字段上的数字是文件的硬链接数量:默认情况下一个目录文件的硬链接只有2个,一个是它本身,另一个是它内部隐藏的目录文件“.”,一个普通文件至少有一个硬链接,因为文件名就是由链接创建的。

    为什么一个硬链接不能关联一个目录?硬链接不能对目录创建受限于文件系统的设计。Linux 文件系统中的目录均隐藏了两个特殊的目录,当前目录.和父目录..其实是两个硬链接,若系统运行对目录创建硬链接,则会产生目录环。

     

    创建硬链接

     

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

     

    [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 共享一样的索引节点号,这就证实这两个文件是一样的文件。

     

    符号链接

    创建符号链接是为了克服硬链接的局限性。符号链接生效,是通过创建一个 特殊类型的文件,这个文件包含一个关联文件或目录的文本指针。在这一方面, 它们和 Windows 的快捷方式差不多,当然,符号链接早于 Windows 的快捷方式 很多年;-)

    一个符号链接指向一个文件,而且这个符号链接本身与其它的符号链接几乎没有区别。 例如,如果你往一个符号链接里面写入东西,那么相关联的文件也被写入。然而, 当你删除一个符号链接时,只有这个链接被删除,而不是文件自身。如果先于符号链接 删除文件,这个链接仍然存在,但是不指向任何东西。在这种情况下,这个链接被称为 坏链接。在许多实现中,ls 命令会以不同的颜色展示坏链接,比如说红色,来显示它们 的存在。

    创建符号链接

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

    符号链接的建立过程相似于创建硬链接:

    [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 命令是个特例。当你删除链接的时候,删除链接本身,而不是链接的对象。
  • 相关阅读:
    XAF 有条件的对象访问权限
    XAF 顯示 UnInplace Report(設置自定義條件顯示報表,不是根據選擇ListView記錄條件顯示報表)
    XAF 如何自定义PivotGrid单元格显示文本?
    XAF 如何布局详细视图上的按钮
    XAF How to set size of a popup detail view
    XAF Delta Replication Module for Devexpress eXpressApp Framework
    XAF 帮助文档翻译 EasyTest Basics(基础)
    XAF 用户双击ListView记录时禁止显示DetailView
    XAF How to enable LayoutView mode in the GridControl in List Views
    XAF 如何实现ListView单元格批量更改?
  • 原文地址:https://www.cnblogs.com/hihtml5/p/9243463.html
Copyright © 2011-2022 走看看