主题
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.txttext
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.txttext
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.txttext
重要数据
第二行
重要数据
第二行因为指向同一份数据(硬链接)或同一个目标(软链接),改哪边另一边都变。
示例 4:删掉原文件后的关键区别
bash
rm real.txt
cat hard.txt
cat soft.txt
ls -l soft.txttext
重要数据
第二行
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.txttext
新内容软链接只是"记着一个路径",只要那个路径上重新出现同名文件,它就自动好了。
示例 6:硬链接的两条限制
bash
ln real.txt /tmp/real_hard.txt && echo "同文件系统可建硬链"
mkdir somedir
ln somedir dirhardtext
同文件系统可建硬链
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,一般用不到。
七、新手易错点
- 忘了
-s:默认建的是硬链接,很多人本意是软链接却建错了。想做快捷方式一定加-s。 - 搞反目标和链接名:语法是
ln -s 目标 链接名,不是ln -s 链接名 目标。写反了会指向错误路径。 - 相对软链接容易断:
ln -s ../a/b.txt link的相对路径是相对链接所在目录,不是相对你执行命令时的目录,挪位置就断。需要整体搬迁用ln -sr。 - 删软链接别带
/:rm linkdir/会进目录删里面的东西;删链接本身用rm linkdir(末尾不加斜杠)。 - 软链接断了不报错直到用它:
ls看链接名还在,实际读才发现No such file。 - 硬链接不能跨分区:想跨盘/跨分区做链接,必须用软链接。
八、相关命令与文档
- 速查页:Linux 命令速查
- 看 inode 和链接数:
ls -li(详解见 ls)、stat(详解见 stat) - 删除链接:
rm(详解见 rm) - inode 与软硬链接原理:见 Linux 文件系统