• Linux ln 命令


    作者:sparkdev

    链接:https://www.cnblogs.com/sparkdev/p/11275722.html

    ln 命令用来在文件之间建立链接。在介绍 ln 命令前,我们先搞清楚究竟什么是硬链接,什么又是软链接。

    Hard Link(硬链接)

    我们知道,在 Linux 系统中,每个文件对应一个 inode,文件的内容存储在 inode 指向的 data block 中。要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的 data block。


    也就是说,文件名存储在目录中,inode 号执行文件存储的内容,文件名和 inode 之间有一个对应关系。那么多个文件名可不可以同时指向同一个 inode 呢?答案是可以的,这就是硬链接!从本质上来说,硬链接只是在目录下新添加了一个文件名,这个文件名与一个已有文件的 inode 相关联。
    我们通过 /etc/crontab 文件来进行观察:

    $ ll -i /etc/crontab
    131213 -rw-r--r-- 1 root root 722 Nov 16  2017 /etc/crontab

    使用 ln 命令在当前目录下创建一个 /etc/crontab 文件的硬链接,然后观察其文件属性:

    $ sudo ln /etc/crontab .
    $ ll -i /etc/crontab crontab
    131213 -rw-r--r-- 2 root root 722 Nov 16  2017 crontab
    131213 -rw-r--r-- 2 root root 722 Nov 16  2017 /etc/crontab

    这两个文件名关联的 inode 号完全相同,都是 131213,所以它们指向的是同一个文件。同时请注意文件属性中的第三个字段,由 1 变成了 2。这个字段被称为 "链接数",它说明有多少个文件名链接到同一个文件的 inode。


    另外需要注意的一点是上面所有输出中的第二个字段中的第一位,它们都是 "-",它说明这个文件的类型为普通文件,链接类型为硬链接。

    我们可以通过下图来理解硬链接在文件系统中的实现方式:

    硬链接的特点

    • 几乎不额外占用空间

    • 只要还有一个文件名引用着文件,文件就不会被真正删除

    由于硬链接只是在目录中添加了一条包含文件名和 对应 inode 的记录,所以它几乎不会消耗额外的磁盘容量。


    另外在删除硬链接所关联的文件时,其实只是删除了一条目录中的记录,真正的文件并不受影响。只有在删除最后一个硬链接时才会真正删除文件的内容数据。

    硬链接的局限性

    • 不能跨文件系统创建硬链接

    • 不能链接目录

    由于这两个限制,实际使用中硬链接并没有软链接使用的广泛,下面我们看看究竟什么是软链接。

    Symbolic Link(软链接)

    软链接的实现方式与硬链接有本质上的不同。创建软链接时会创建一个新的文件(分配一个 inode 和对应的 data block),新文件的 data block 中存储了目标文件的路径。
    还拿 /etc/crontab 文件举例子,这次创建一个软链接并查看其文件属性:

    $ sudo ln -s /etc/crontab crontab2

    第一列,两个文件名对应的 inode 不同,说明这是两个文件。

    第二列显示的文件权限也不一样,这一点和硬链接完全不同。注意文件类型被标记为 "l",说明这是一个软链接文件。


    第三列很有意思,注意 /etc/crontab 文件的链接数量,还是 2,这和创建软链接文件 crontab2 前是一样的。也就是说创建软链接并不增加原文件的链接数。


    第六列是文件大小,注意新建的软链接文件大小为 12 Bytes,也就是字符串 "/etc/crontab" 的长度。 


    最后一列会友好的显示出软链接文件指向的源文件。

    我们可以通过下图来理解软链接在文件系统中的实现方式:

    从上图我们可以看出,软链接文件 crontab2 是一个实实在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目标文件的地址:/etc/crontab。 像 open() 这样的 API 能够识别出软链接,并根据 data block 中的目标文件径把操作重定向到目标文件上。

    可以链接目录是软链接的一大优势,创建目录链接的方式和普通文件一样:

    $ ln -s /bin testbin

    此时进入 testbin 目录和进入 /bin 目录是一样的。

    更厉害的是,还可以跨文件系统创建软链接!

    删除源文件


    对于软链接来说,删除源链接后,链接文件就会无法找到指向的源文件了。看下面的演示:

    $ echo "hello world" > hello.txt
    $ ln -s hello.txt hello2
    $ cat hello2
    hello world
    $ rm hello.txt
    $ cat hello2
    cat: hello2: No such file or directory

    删除原文件后,操作链接文件时的提示是:"No such file or directory"。

    文件的链接数

    从上文中的示例我们可以看到,当创建硬链接文件时,文件的链接数会增加 1,而创建软链接时文件的链接数却不发生变化。


    下面让我们看一个目录文件的链接数,先创建一个空目录:

    $ mkdir /home/nick/testdir
    $ ll  /home/nick | grep testdir
    drwxr-xr-x  2 nick nick  4096 Jul 10 08:58 testdir/

    新建的空目录有两个硬链接,分别是:

    /home/nick/testdir
    /home/nick/testdir/.

    而 /home/nick/testdir 目录下还有一个指向其父目录的硬链接:/home/nick/testdir/..

    也就是说当我们创建一个目录时,其父目录的硬链接数会增加 1。

    ln 命令

    ln 命令用来在文件之间建立链接,其的常用方式为:


    ln source target

    ln -s source target


    它们分别用来创建硬链接文件和软链接文件。还有一个比较常用的选项是 f,它会强制删除已经存在的目标文件。

    参考:

    ln man page
    鸟哥的私房菜
    彻底理解“软链接”和“硬链接”
    The difference between hard and soft links

    十年磨一剑
  • 相关阅读:
    如何把python最小化安装在客户机上面
    c++的历史-异常
    插件系统的构建
    ora-01445:无法从不带保留关键字的表的连接视图中选择ROWID或采样
    转--Oracle 审计和测试操作
    foreach属性-动态-mybatis中使用map类型参数,其中key为列名,value为列值
    C语言中 *.c和*.h文件的区别!
    解决方法:loadrunner 场景下执行webservice脚本是---报错10492 Error: Exception was raised when calling per-process-init function in extens
    NoSQL之Redis高级实用命令详解--安全和主从复制
    Expect安装方法
  • 原文地址:https://www.cnblogs.com/qinlulu/p/13204870.html
Copyright © 2020-2023  润新知