ln 创建文件链接

作用

ln(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用 ln 命令链接(link)它就可以,不必重复的占用磁盘空间。

链接分为软链接和硬链接

软链接,全称是软链接文件,英文叫作 symbolic link。这类文件其实非常类似于 Windows 里的快捷方式,这个软链接文件(假设叫 VA)的内容,其实是另外一个文件(假设叫 B)的路径和名称,当打开 A 文件时,实际上系统会根据其内容找到并打开 B 文件。

硬链接,全称叫作硬链接文件,英文名称是 hard link。这类文件比较特殊,这类文件(假设叫 A)会拥有自己的 inode 节点和名称,其 inode 会指向文件内容所在的数据块。与此同时,该文件内容所在的数据块的引用计数会加 1。当此数据块的引用计数大于等于 2 时,则表示有多个文件同时指向了这一数据块。一个文件修改,多个文件都会生效。当删除其中某个文件时,对另一个文件不会有影响,仅仅是数据块的引用计数减 1。当引用计数为 0 时,则系统才会清除此数据块。

语法

 ln [参数] [源文件或目录] [目标文件或目录]

建立硬链接的命令格式是:

ln 源文件名称 硬链接文件名称

建立软链接的命令格式是(必须加上 -s 选项,即 --symbolic 选项):

ln -s 源文件名称 软链接文件名称

参数

  • --backup[=CONTROL] 备份已存在的目标文件

  • -b 类似 --backup ,但不接受参数

  • -d 允许超级用户制作目录的硬链接

  • -f 强制执行

  • -i 交互模式,文件存在则提示用户是否覆盖

  • -n 把符号链接视为一般目录

  • -s 软链接(符号链接)

  • -v 显示详细的处理过程

  • -S "-S<字尾备份字符串> "或 "--suffix=<字尾备份字符串>"

  • -V "-V<备份方式>"或"--version-control=<备份方式>"

  • --help 显示帮助信息

  • --version 显示版本信息

示例

(1)建立一个硬链接

# 查看源文件内容
hxstrive@hxstrive:~$ cat source.txt
ID    NAME     AGE
100   Helen    27
200   Tom      31
300   Joe      37

# 通过 ls 看看文件信息, 注意开头的"-", 表示这是一个普通文件
hxstrive@hxstrive:~$ ls -l source.txt
-rw-r--r-- 1 hxstrive hxstrive 73 Jan 15 07:20 source.txt

# 用 ln 命令建立 source.txt 文件的硬链接
hxstrive@hxstrive:~$ ln source.txt hardsource.txt

# 通过 ls -i 查看两个文件的 inode, 发现是完全相同的, 表示它们指向的是同一数据块
hxstrive@hxstrive:~$ ls -il source.txt hardsource.txt
10270 -rw-r--r-- 2 hxstrive hxstrive 73 Jan 15 07:20 hardsource.txt
10270 -rw-r--r-- 2 hxstrive hxstrive 73 Jan 15 07:20 source.txt

从上面输出可知,两个文件的 inode 均为 10270,表示它们指向同一个数据块。

(2)建立一个软连接

# 用 ln -s 命令创建 source.txt 文件的硬链接
hxstrive@hxstrive:~$ ln -s source.txt softsource.txt

# 通过 ls -i 查看两个文件的 inode, 发现是不相同的, 表示它们指向的是不同的数据块
hxstrive@hxstrive:~$ ls -il source.txt softsource.txt
10265 lrwxrwxrwx 1 hxstrive hxstrive 10 Jan 15 07:25 softsource.txt -> source.txt
10270 -rw-r--r-- 2 hxstrive hxstrive 73 Jan 15 07:20 source.txt

(3)创建目录的链接

# 查看当前目录内容
hxstrive@hxstrive:~$ ls -F
hardsource.txt  linkdir@  softsource.txt@  source.txt  tmpdir/

# 用 ln 创建 tmpdir 目录的软链接
hxstrive@hxstrive:~$ ln -s tmpdir/ linkdir

# 通过 ls -i 查看两个目录的 inode, 发现是不相同的,指向不同的数据块
hxstrive@hxstrive:~$ ls -il | grep dir
25017 lrwxrwxrwx 1 hxstrive hxstrive    7 Jan 15 07:29 linkdir -> tmpdir/
24978 drwxr-xr-x 2 hxstrive hxstrive 4096 Jan 15 07:30 tmpdir

(4)创建目录的硬链接,是不允许的,如下:

hxstrive@hxstrive:~$ ln tmpdir/ harddir
ln: tmpdir/: hard link not allowed for directory

hxstrive@hxstrive:~$ sudo ln tmpdir/ harddir
[sudo] password for hxstrive:
ln: tmpdir/: hard link not allowed for directory

提示,不允许创建目录的硬链接。为什么?Linux 系统中的硬链接有两个限制:

  • 不能跨越文件系统。

  • 不允许普通用户对目录作硬链接。

我们对任何一个目录用 ls-l 命令都可以看到其链接数至少是 2,这也说明了系统中是存在基于目录的硬链接的,而且命令 ln-d(-d选项表示针对目录建立硬链接)也允许 root 用户尝试对目录作硬链接。这些都说明了系统限制对目录进行硬链接只是一个硬性规定,并不是逻辑上不允许或技术上不可行。那么操作系统为什么要进行这个限制呢?


这是因为,如果引入了对目录的硬连接就有可能在目录中引入循环链接,那么在目录遍历的时候系统就会陷入无限循环当中。也许有人会说,符号连接不也可以引入循环链接吗,那么为什么不限制目录的符号连接呢?

原因就在于,在 Linux 系统中,每个文件(目录也是文件)都对应着一个 inode 结构,其中 inode 数据结构中包含了文件类型(目录、普通文件、符号连接文件等)的信息,也就是说,操作系统在遍历目录时可以判断出其是否是符号连接。既然可以判断出它是否是符号连接,当然就可以采取一些措施来防范进入过大过深的循环层次,于是大部分系统会规定在连续遇到 8 个符号连接后就停止遍历。但是对于硬链接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。

基于这样的考虑,系统不允许普通用户建立目录硬链接。

更多关于命令详细参考手册,请使用 man 命令或者 --help 参数获取帮助信息

关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号