还拿 /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 命令用来在文件之间建立链接,其的常用方式为:










