Skip to content

ln 命令详解:软链接与硬链接 ​

本文是 Linux 命令速查 中 ln 的从 0 到 1 详解。 目标:把 ln --help 里的每个选项讲清楚,多看几遍后,你在服务器上敲 ln --help 就知道该用哪个选项。 环境依据:GNU coreutils 8.32(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。

一、命令是干什么的 ​

ln 是 link(链接) 的缩写,用来给文件再"起一个名字"。它能建两种链接:

  • 软链接(符号链接,-s):像 Windows 的快捷方式,是一个独立的小文件,里面写着"真正的文件在哪";
  • 硬链接(不加 -s):给同一个 inode 再挂一个名字,两个名字指向磁盘上同一份数据。

日常 99% 用的是软链接 ln -s:把长路径、别的盘的目录、版本化的程序链接到一个好找的位置。

类比:软链接 = 桌面快捷方式(原文件删了,快捷方式就失效);硬链接 = 同一个文件的两个门牌号(从哪个门进去都是同一间屋,拆掉一个门牌号屋子还在)。

属于 GNU coreutils。

二、命令语法 ​

bash
ln [选项]... 目标  链接名
ln [选项]... 目标...  目录        # 把多个目标链到某目录下
  • 目标:被链接的原始文件/目录;
  • 链接名:要新建的链接叫什么;
  • 默认建硬链接;加 -s 才建软链接。
  • 建硬链接时目标必须已存在;软链接可以指向不存在的路径(以后再建也行)。

最常用的写法:

bash
ln -s /真实/路径  链接名

三、选项全表(对照 ln --help) ​

1. 选哪种链接(最重要) ​

选项中文含义什么场景用
-s,--symbolic建软链接(符号链接)几乎总是用它,类似快捷方式
-d,-F,--directory允许 root 尝试给目录建硬链接极少用,普通用户会被拒
-L,--logical目标本身是软链接时,跟随它处理嵌套软链接时
-P,--physical目标是软链接时,直接链接链接本身较少用(默认)
-r,--relative建相对路径的软链接链接与目标在可整体移动的目录树里时

2. 目标已存在时怎么办 ​

选项中文含义什么场景用
-f,--force目标链接名已存在就先删掉再建想覆盖重建链接时(配合 -sf 极常用)
-i,--interactive覆盖前询问怕误覆盖时
-n,--no-dereference若链接名是个指向目录的软链接,把它当普通文件处理重建指向目录的软链接时

3. 位置与输出 ​

选项中文含义什么场景用
-t 目录,--target-directory=目录在指定目录里建链接一次链多个目标
-T,--no-target-directory把链接名当普通文件防止被当目录塞进去
-v,--verbose打印每个链接动作看建了哪些
--backup[=CONTROL] / -b / -S 后缀覆盖前备份旧链接怕覆盖坏时

四、由浅入深的典型示例 ​

示例 1:建软链接(最常用) ​

bash
echo "重要数据" > real.txt
ln -s real.txt soft.txt
ls -l soft.txt
cat soft.txt
text
lrwxrwxrwx 1 user user 8 Sep 30 23:30 soft.txt -> real.txt
重要数据

soft.txt -> real.txt 这个箭头就表示"它指向 real.txt"。读 soft.txt 实际读到的是 real.txt 的内容。

示例 2:建硬链接,看 inode ​

bash
ln real.txt hard.txt
ls -li real.txt hard.txt soft.txt
text
528379 -rw-r--r-- 2 user user 13 Sep 30 23:30 hard.txt
528379 -rw-r--r-- 2 user user 13 Sep 30 23:30 real.txt
528380 lrwxrwxrwx 1 user user  8 Sep 30 23:30 soft.txt -> real.txt

最左边是 inode 号:real.txt 和 hard.txt 都是 528379(同一份数据,只是两个名字);soft.txt 是 528380(它自己是个独立小文件)。real.txt 后面的链接数 2 就是因为又多了 hard.txt 这个名字。

示例 3:改原文件,两个链接都跟着变 ​

bash
echo "  第二行" >> real.txt
cat hard.txt
cat soft.txt
text
重要数据
  第二行
重要数据
  第二行

因为指向同一份数据(硬链接)或同一个目标(软链接),改哪边另一边都变。

示例 4:删掉原文件后的关键区别 ​

bash
rm real.txt
cat hard.txt
cat soft.txt
ls -l soft.txt
text
重要数据
  第二行
cat: soft.txt: No such file or directory
lrwxrwxrwx 1 user user 8 Sep 30 23:30 soft.txt -> real.txt

这是软/硬链接最本质的区别:

  • 硬链接 hard.txt 还能读——数据还在(只要还有一个名字指着它,inode 就不释放);
  • 软链接 soft.txt 立刻断链——ls -l 里它还写着指向 real.txt,但目标没了,读就报错。

示例 5:软链接断了,原文件回来后它自动复活 ​

bash
echo "新内容" > real.txt
cat soft.txt
text
新内容

软链接只是"记着一个路径",只要那个路径上重新出现同名文件,它就自动好了。

示例 6:硬链接的两条限制 ​

bash
ln real.txt /tmp/real_hard.txt && echo "同文件系统可建硬链"
mkdir somedir
ln somedir dirhard
text
同文件系统可建硬链
ln: somedir: hard link not allowed for directory

硬链接:① 不能跨文件系统(不同分区/U盘之间不行);② 普通用户不能给目录建硬链接(防止把目录结构绕成环)。软链接没有这两个限制——所以日常都用软链接。

示例 7:常用组合 ln -sf(强制重建软链接) ​

bash
ln -sfn /真实/新路径  mylink

已存在同名链接时,-f 先删掉旧的再建新的,-n 防止它把"指向目录的旧链接"当成目录往里塞。脚本里更新软链接几乎都这么写。

五、高频组合速记 ​

命令用途
ln -s 目标 链接名建软链接(最常用)
ln -sfn 目标 链接名强制重建指向目录的软链接
ln 目标 硬链接名建硬链接(少用)
ls -l 链接看它指向谁
ls -li 文件看 inode,判断硬链接

六、RHEL 系与 Debian 系差异 ​

ln 属于 GNU coreutils,两系用法完全一致。仅有的提醒:

  • 两系都不允许普通用户给目录建硬链接,这是内核层面限制;
  • 软链接在两系行为相同;SELinux 环境下跨域链接可能需要 -Z/--context,一般用不到。

七、新手易错点 ​

  1. 忘了 -s:默认建的是硬链接,很多人本意是软链接却建错了。想做快捷方式一定加 -s。
  2. 搞反目标和链接名:语法是 ln -s 目标 链接名,不是 ln -s 链接名 目标。写反了会指向错误路径。
  3. 相对软链接容易断:ln -s ../a/b.txt link 的相对路径是相对链接所在目录,不是相对你执行命令时的目录,挪位置就断。需要整体搬迁用 ln -sr。
  4. 删软链接别带 /:rm linkdir/ 会进目录删里面的东西;删链接本身用 rm linkdir(末尾不加斜杠)。
  5. 软链接断了不报错直到用它:ls 看链接名还在,实际读才发现 No such file。
  6. 硬链接不能跨分区:想跨盘/跨分区做链接,必须用软链接。

八、相关命令与文档 ​