ln 软链接/硬链接使用指南
# 📖 简介
ln 是 Linux/macOS 下的链接创建命令,分为:
- 软链接(Symbolic Link):类似 Windows 的快捷方式,指向原文件路径
- 硬链接(Hard Link):多个文件名指向同一个 inode
# 📝 语法
ln [选项] 源文件 目标文件
1
# ⚡ 常用命令
# 1. 创建软链接(最常用)
ln -s 源文件 目标链接
1
示例:把主项目的 node_modules 链接到 worktree
cd ../myproject-feature-branch
ln -s ../myproject/node_modules node_modules
1
2
2
# 2. 创建硬链接
ln 源文件 目标文件
1
# 3. 覆盖已有链接
ln -sf 源文件 目标链接
1
-f:强制覆盖已存在的目标文件
# 4. 查看链接指向
ls -l 目标链接
# 或
readlink 目标链接
1
2
3
2
3
# 5. 删除链接
rm 目标链接
# 或
unlink 目标链接
1
2
3
2
3
⚠️ 删除软链接不会删除原文件,放心删。
# 💡 常用场景
# 场景1:Git Worktree 复用 node_modules
# 创建 worktree 后,链接主项目的 node_modules
cd ../myproject-feature-branch
ln -s ../myproject/node_modules node_modules
1
2
3
2
3
优点:秒完成,不用重新 npm install 缺点:worktree 里改了 package.json 需要重新安装
# 场景2:配置文件统一管理
# 把配置文件统一放在 dotfiles 目录,软链接到 home
ln -s ~/dotfiles/.zshrc ~/.zshrc
ln -s ~/dotfiles/.tmux.conf ~/.tmux.conf
1
2
3
2
3
# 场景3:常用工具快捷方式
# 把常用脚本链接到 /usr/local/bin
ln -s ~/scripts/mytool.sh /usr/local/bin/mytool
1
2
2
# 🆚 软链接 vs 硬链接
| 特性 | 软链接(-s) | 硬链接 |
|---|---|---|
| 是否可以跨文件系统 | ✅ 可以 | ❌ 不可以 |
| 是否可以链接目录 | ✅ 可以 | ❌ 不可以 |
| 删除原文件后 | 链接失效(悬空链接) | 链接仍有效(数据仍在) |
| inode | 新的 inode | 和原文件相同 inode |
| 适用场景 | 目录、跨分区、快捷方式 | 文件备份、节省空间 |
# 🆚 硬链接 vs Copy
一句话:硬链接是同一份数据多一个名字,Copy 是数据复制一份、从此互不相干。
| 特性 | 硬链接 | Copy(cp) |
|---|---|---|
| inode | 相同(指向同一份数据) | 不同(数据完整复制一份) |
| 磁盘占用 | 几乎为 0(只新增一条目录项) | 数据占多少就翻多少 |
| 内容是否同步 | ✅ 改一处处处可见(本质是同一个文件) | ❌ 复制后各自独立、互不影响 |
| 删除原文件后 | 链接仍有效(引用计数 -1,数据不删) | 不影响(本来就是两份) |
| 元数据(权限/时间戳) | 共享同一套 | 各自独立 |
| 适用场景 | 去重、增量备份(如 rsync --link-dest) | 独立快照、真正的备份 |
验证:
echo "hello" > a.txt
ln a.txt b.txt # 硬链接
cp a.txt c.txt # 复制
ls -i a.txt b.txt c.txt
# a.txt、b.txt 的 inode 相同;c.txt 不同
# ls -l 第二列的数字 = 指向该 inode 的硬链接数
echo " world" >> b.txt
cat a.txt # hello world —— 硬链接同步变化
cat c.txt # hello —— 复制不受影响
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
💡 macOS 补充:APFS 上
cp -c走 clonefile(写时复制),初始不占额外空间、修改后才真正复制——兼得 Copy 的独立性和硬链接的省空间。 ⚠️ 编辑器坑:vim/VS Code 保存时常是"写临时文件再替换",会把硬链接拆成两份。想保住硬链接关系:追加写入(echo >>)或 vim 设置set backupcopy=yes原地写入。
# ⚠️ 注意事项
# 1. 相对路径 vs 绝对路径
- 用相对路径创建的软链接,移动目录后可能失效
- 用绝对路径创建的软链接,移动源文件后失效
# 2. 相对路径的计算
- 相对路径是相对于链接所在目录,不是当前目录
# 3. 检查链接是否有效
# 如果输出为空,说明链接有效
# 如果报错 "No such file or directory",说明链接失效
ls -l 目标链接
1
2
3
2
3
# 4. 批量查找失效链接
# 查找所有失效的软链接
find . -xtype l
1
2
2
上次更新: 2026/10/09, 15:51:11