ln 是 Linux/Unix 系统中用于创建链接的命令。链接可以理解为文件的"快捷方式"或"别名",但比 Windows 的快捷方式更强大。
📝 核心概念:硬链接 vs 软链接
ln 可以创建两种完全不同的链接:
| 特性 | 硬链接 | 软链接(符号链接) |
|---|---|---|
| 创建方式 | ln 源文件 链接名 |
ln -s 源文件 链接名 |
| 本质 | 同一个文件的多个名字 | 指向源文件的特殊文件(存路径) |
| 跨文件系统 | ❌ 不可以 | ✅ 可以 |
| 链接目录 | ❌ 不可以(防止循环) | ✅ 可以 |
| 源文件删除后 | 链接依然可用 | 链接变成红色闪烁的断链 |
| inode | 与源文件相同的 inode | 不同的 inode |
| 文件大小 | 不额外占用空间 | 占用很小空间(存路径字符串) |
🔍 简单理解
-
硬链接:同一个文件实体,有两个门牌号(文件名)
-
软链接:一个独立的文件,里面写着"我是谁谁谁的快捷方式"
💡 常用命令格式
bash
# 基本语法
ln [选项] 源文件 目标链接名
# 创建硬链接
ln file1.txt file1_hard.link
# 创建软链接(最常用)
ln -s file1.txt file1_soft.link
# 创建目录的软链接
ln -s /path/to/original/dir dir_link
# 强制覆盖已存在的链接
ln -sf 新源文件 已存在的链接名
# 创建软链接时使用绝对路径(避免移动后失效)
ln -s /绝对/路径/源文件 链接名
📊 对比示例:硬链接
bash
# 创建一个文件
echo "Hello" > original.txt
# 创建硬链接
ln original.txt hard.txt
# 查看详细信息(注意 inode 号相同)
ls -li original.txt hard.txt
# 输出示例:
# 1234567 -rw-r--r-- 2 user user 6 Apr 29 10:00 original.txt
# 1234567 -rw-r--r-- 2 user user 6 Apr 29 10:00 hard.txt
# ^ 相同的 inode ^ 链接数变成了2
# 修改任意一个,另一个也会变
echo "World" >> hard.txt
cat original.txt # 输出: Hello World
# 删除源文件,硬链接还在且内容完整
rm original.txt
cat hard.txt # 输出: Hello World (仍然正常)
🔗 重点:软链接(符号链接)
这是你在实际工作中最常用的,相当于"快捷方式"。
bash
# 创建软链接
ln -s /usr/bin/python3 python3.link
# 查看(注意颜色和箭头)
ls -l python3.link
# 输出:lrwxrwxrwx 1 user user 18 Apr 29 10:00 python3.link -> /usr/bin/python3
# ^ 类型是 l (link) ^ 箭头指向源文件
# 目录的软链接
ln -s /var/log logs_link
cd logs_link # 直接进入源目录
⚠️ 软链接的陷阱
bash
# 坑1:相对路径的问题
cd /tmp
ln -s /home/user/data data_link # ✅ 绝对路径,安全
ln -s ../home/user/data data_link2 # ❌ 相对路径,移动后就失效
# 坑2:删除源文件后,链接变成"断链"
rm -rf /home/user/data
ls -l data_link
# 输出:lrwxrwxrwx 1 user user 18 Apr 29 10:00 data_link -> /home/user/data (红色闪烁或显示文件不存在)
# 坑3:对软链接执行 rm 需要小心
rm dir_link/ # ❌ 这会删除目录内容!不是删除链接本身
rm dir_link # ✅ 删除链接文件本身(不加斜杠)
unlink dir_link # ✅ 专门删除链接的命令
🎯 实际应用场景
1. 版本管理(最常见)
bash
# 维护多个版本,用软链接指代"当前版本"
ls -l
# lrwxrwxrwx 1 root root 12 Apr 29 10:00 current -> python3.8
# -rwxr-xr-x 1 root root 5000 Apr 29 09:00 python3.6
# -rwxr-xr-x 1 root root 5200 Apr 29 09:00 python3.8
# -rwxr-xr-x 1 root root 5500 Apr 29 09:00 python3.9
# 切换版本只需修改链接
ln -sf python3.9 current # 快速切换到 3.9
2. 节省磁盘空间
bash
# 多个项目引用同一个大文件,但只占一份磁盘空间
mkdir project1 project2
echo "Big data" > data.bin
ln data.bin project1/data.bin # 硬链接,不占额外空间
ln data.bin project2/data.bin
3. 路径简化
bash
# 把深层路径映射到方便的地方
ln -s /var/log/nginx/access.log ~/nginx.log
ln -s /mnt/huge_nas_drive/videos ~/videos
4. 备份时保留链接
bash
# 使用 cp -d 保留软链接属性
cp -rd /etc/ nginx_config_backup/
🔧 高级技巧
查看所有硬链接
bash
# 找到文件的 inode,然后查找所有指向它的文件
ls -i file.txt # 假设 inode 是 123456
find . -inum 123456
查找损坏的软链接
bash
# 找出所有指向不存在目标的链接
find /path -type l ! -exec test -e {} \; -print
批量创建链接
bash
# 为某个目录下的所有 .conf 文件创建软链接
for file in /etc/nginx/conf.d/*.conf; do
ln -s "$file" "./$(basename $file)"
done
📋 快速参考卡
| 需求 | 命令 |
|---|---|
| 创建硬链接 | ln source linkname |
| 创建软链接 | ln -s source linkname |
| 强制覆盖已有链接 | ln -sf source linkname |
| 查看链接信息 | ls -l linkname |
| 删除链接 | rm linkname 或 unlink linkname |
| 复制时保留链接 | cp -d source dest |
| 查找某文件的硬链接 | `find / -inum $(ls -i file |
⚠️ 安全提示
-
不要对目录创建硬链接:系统不允许,因为可能造成循环引用
-
谨慎使用
rm -rf处理软链接目录 :不加-f会删除链接本身,加了可能删源目录 -
软链接的权限无关紧要:真正起作用的总是源文件的权限
-
跨文件系统时自动降级:如果无法创建硬链接,系统会报错,不会自动创建软链接
总结一句话 :需要文件"快捷方式"并且可能跨磁盘或指向目录 → 用 ln -s (软链接);需要在同一磁盘上节省空间且永不担心源文件被删 → 用 ln (硬链接)。日常工作中 ln -s 覆盖 90% 的使用场景。