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 参数获取帮助信息