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 | cut -d' ' -f1) |
⚠️ 安全提示
-
不要对目录创建硬链接:系统不允许,因为可能造成循环引用
-
谨慎使用
rm -rf处理软链接目录:不加-f会删除链接本身,加了可能删源目录 -
软链接的权限无关紧要:真正起作用的总是源文件的权限
-
跨文件系统时自动降级:如果无法创建硬链接,系统会报错,不会自动创建软链接
总结一句话:需要文件"快捷方式"并且可能跨磁盘或指向目录 → 用 ln -s(软链接);需要在同一磁盘上节省空间且永不担心源文件被删 → 用 ln(硬链接)。日常工作中 ln -s 覆盖 90% 的使用场景。
转载自CSDN-专业IT技术社区



