Linux 常用命令 - ln 【为文件创建链接】

简介

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 指令最终的行为。

  • 创建硬链接时,源文件和硬链接必须位于同一文件系统内。

  • 删除源文件不会影响到硬链接的访问,因为硬链接指向的是文件的内容。但删除符号链接的源文件会导致符号链接失效。(详细原理可以查看上文中知识拓展的文章)

  • 使用符号链接时要注意相对路径和绝对路径的区别,尤其是在移动文件时。

  • 一般情况下硬链接不能指向目录,而符号链接可以。

相关推荐
Elastic 中国社区官方博客8 分钟前
如何通过一条 ES|QL 查询为 Elasticsearch 中的每个指标构建指标图表
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·kibana
dawnsky.liu8 分钟前
RHEL - 使用 RHEL 的 EUS 获得延长更新支持
linux
CET中电技术12 分钟前
工业园区源网荷储一体化怎么建?CET中电技术x中信重工洛阳伊滨厂区项目技术拆解
运维
晴天1612 分钟前
不同操作系统可执行文件差异全景解析
linux
数据库小学妹29 分钟前
MySQL redo刷盘实测:innodb_flush_log_at_trx_commit与故障矩阵
运维·数据库·mysql
充电zcx1 小时前
Linux:2:Linux下的基本指令
linux·运维·服务器
数安旭说1 小时前
从“人治”到“平台化”:迪康端点安全一体化管理平台的任务协同实战
运维·数据安全·软件需求·企业管理·终端管理·终端安全·终端运维
handler011 小时前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
可视化运维管理爱好者2 小时前
机房工勘记录器分享
运维·网络·nvisual
i网路游侠2 小时前
免费堡垒机 | 福瑞智能运维审计系统(堡垒机)?
运维·堡垒机·等级保护·运维审计·运维安全审计