简介
ln 命令来源于英文单词 "link",意为"链接"。在 Linux 系统中,ln 命令用于创建文件的链接,包括硬链接和符号链接(软链接)。硬链接是对文件内容的直接指向,而符号链接则类似于 Windows 系统中的快捷方式,指向文件或目录的路径。
使用方式
bash
ln [选项]... 链接对象 [链接名]
常用选项
-
--backup[=CONTROL]
:在创建新的链接之前,若指定的链接文件存在,则对每个已经存在的链接文件进行备份。 -
-b
:类似于--backup
但不接受任何参数。 -
-d, -F, --directory
:允许管理员(超级用户 root)尝试创建目录的硬链接。 -
-f, --force
:创建链接时如果目标名称已被其他文件或链接占用,则删除已存在的文件或链接。 -
-i, --interactive
:如果出现覆盖操作(如指定链接名已被其他文件占用),则在覆盖已有文件之前会先提示用户确认。 -
-L, --logical
:解引用符号链接:如果指定的源文件是个符号链接,则 ln 命令会创建该符号链接所指向实际文件的链接,而不是创建指向符号链接本身的链接。 -
-P, --physical
:如果指定的源文件是个符号链接,则创建链接时直接指向符号链接,而不是符号链接所指向的实际文件(区别于-L
)。 -
-n, --no-dereference
:如果指定的链接名称已经存在,并且其是一个指向目录的符号链接,则 ln 命令会将其视为一个普通文件,而不是解引用成该符号链接所指向的目录。这意味着可以通过该选项对一个已存在的指向目录的符号链接进行更新或替换,而不是在这个符号链接所指向的目录中创建一个新的链接。 -
-r, --relative
:创建符号链接时会自动计算并使用链接与目标文件的相对位置。这样,即使移动了符号链接和其目标(只要它们的相对位置不变),链接仍然有效。 -
-s, --symbolic
:创建一个符号链接,而不是默认的硬链接。 -
-S, --suffix=SUFFIX
:用-b
参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号~
,用户可通过-S
参数来改变它。 -
-t, --target-directory=DIRECTORY
:指定一个目录,在这个目录中创建链接。 -
-T, --no-target-directory
:使用该选项后,如果指定的链接目标已经存在,ln 命令会预期这个目标是一个普通文件而不是目录,即使它实际上是一个目录(这时候 ln 会报错,而不是按原有的逻辑在这个目录中创建链接)。 -
-v, --verbose
:显示详细的操作信息。 -
--help
:显示帮助信息。 -
--version
:显示版本信息。
参考示例
1. 创建指定名称的硬链接
bash
ln a.txt a.txt.link
创建一个名为 a.txt.link 的硬链接指向 a.txt,创建完成后使用 ls 命令查看链接文件确认创建成功:
bash
jay@jaylinuxlenovo:~/test$ ln a.txt a.txt.link
jay@jaylinuxlenovo:~/test$ ls -l a.txt.link
-rw-rw-r-- 2 jay jay 13 Feb 20 21:27 a.txt.link
2. 创建硬链接到指定目录
bash
ln a.txt ln_test
ln_test 为一个目录名,首先使用 ls 命令查看 ln_test 目录下没有任何内容,接着使用 ln 命令在 ln_test 下创建一个硬链接,再次查看目录下内容确认创建成功:
bash
jay@jaylinuxlenovo:~/test$ ls -l ln_test/
total 0
jay@jaylinuxlenovo:~/test$ ln a.txt ln_test
jay@jaylinuxlenovo:~/test$ ls -l ln_test/
total 4
-rw-rw-r-- 2 jay jay 13 Feb 20 21:27 a.txt
3. 创建符号链接
bash
ln -s a.txt a.txt.slink
使用 -s 选项可以创建一个符号链接。此处创建了一个 a.txt.slink 的符号链接指向 a.txt,使用 ls 命令确认创建的符号链接信息:
bash
jay@jaylinuxlenovo:~/test$ ln -s a.txt a.txt.slink
jay@jaylinuxlenovo:~/test$ ls -l a.txt.slink
lrwxrwxrwx 1 jay jay 5 Feb 20 21:36 a.txt.slink -> a.txt
4. 强制创建符号链接
bash
ln -sf test.txt a.txt.slink
此处尝试创建一个 a.txt.slink 指向 test.txt 文件,但是由于上面的例子中我们已经创建了一个 a.txt.slink,所以直接创建会报错。此时我们使用 -f 选项强制创建,即可成功创建,并覆盖原来的 a.txt.slink ,此时该链接指向的是 test.txt 而不是之前的 a.txt:
bash
jay@jaylinuxlenovo:~/test$ ls -l a.txt.slink
lrwxrwxrwx 1 jay jay 5 Feb 20 21:36 a.txt.slink -> a.txt #已存在的符号链接
jay@jaylinuxlenovo:~/test$ ln -s test.txt a.txt.slink
ln: failed to create symbolic link 'a.txt.slink': File exists #直接创建已存在文件会报错
jay@jaylinuxlenovo:~/test$ ln -sf test.txt a.txt.slink #强制创建成功
jay@jaylinuxlenovo:~/test$ ls -l a.txt.slink
lrwxrwxrwx 1 jay jay 8 Feb 20 21:44 a.txt.slink -> test.txt #链接信息改变
5. 遇到已存在文件则创建备份
bash
ln -sb test.txt a.txt.slink
同例 4 中描述的,a.txt.slink 已存在的情况下无法直接创建同名链接,此时也可以使用 -b 选项告知 ln 在遇到冲突时创建一个备份文件。此时可以看到指令执行完后新增了一个 a.txt.slink~ ,其指向 a.txt,也就是原来 a.txt.slink 的备份,而新的 a.txt.slink 已经指向了 test.txt。
bash
jay@jaylinuxlenovo:~/test$ ls -l a.txt.*
lrwxrwxrwx 1 jay jay 5 Feb 20 21:55 a.txt.slink -> a.txt
jay@jaylinuxlenovo:~/test$ ln -sb test.txt a.txt.slink
jay@jaylinuxlenovo:~/test$ ls -l a.txt.*
lrwxrwxrwx 1 jay jay 8 Feb 20 21:57 a.txt.slink -> test.txt
lrwxrwxrwx 1 jay jay 5 Feb 20 21:55 a.txt.slink~ -> a.txt
6. 显示创建链接的详细信息
bash
ln -v a.txt ln_test
使用 -v 选项会在创建链接时显示链接创建的详细信息:
bash
jay@jaylinuxlenovo:~/test$ ln -v a.txt ln_test
'ln_test/a.txt' => 'a.txt'
注意事项
-
虽然
-d
选项允许管理员创建指向目录的硬链接,但通常不推荐这么做,并且由于系统的限制,该操作即使由管理员调用,也有可能失败。 -
如果使用了
-s
选项则会忽略-L
和-P
。否则,当目标文件是个符号链接时,最后指定的选项会决定 ln 指令最终的行为。 -
创建硬链接时,源文件和硬链接必须位于同一文件系统内。
-
删除源文件不会影响到硬链接的访问,因为硬链接指向的是文件的内容。但删除符号链接的源文件会导致符号链接失效。(详细原理可以查看上文中知识拓展的文章)
-
使用符号链接时要注意相对路径和绝对路径的区别,尤其是在移动文件时。
-
一般情况下硬链接不能指向目录,而符号链接可以。