两种链接
ln source link # 硬链接(hard link)
ln -s source link # 软链接 / 符号链接(symbolic link)
软链接(symlink)—— 用得最多
像 Windows 的"快捷方式":
ln -s /var/log/nginx/access.log /tmp/nginx-log
ls -l /tmp/nginx-log
# lrwxrwxrwx 1 wadely wadely 24 ... /tmp/nginx-log -> /var/log/nginx/access.log
特点:
- 指向路径——源文件移动 / 删除 → 链接变"死链"
- 可以跨文件系统、跨分区
- 可以指向目录
- 是独立的"小文件"(只存路径)
硬链接 —— 同一个文件多个名字
ln /home/file.txt /tmp/file-alt
# 两者实际是同一份数据
ls -li /home/file.txt /tmp/file-alt
# 12345 -rw-r--r-- 2 wadely wadely 1234 ... /home/file.txt
# 12345 -rw-r--r-- 2 wadely wadely 1234 ... /tmp/file-alt
# ↑ ↑
# inode 一样 链接计数 = 2
特点:
- 指向 inode(磁盘上的实际数据块)
- 删了源文件,硬链接还能访问内容(数据只在最后一个名字被删时才释放)
- 不能跨文件系统(inode 只在自家文件系统有意义)
- 不能给目录建硬链接(防止循环)
决策矩阵
| 需求 | 用哪种 |
|---|---|
| 跨分区 / 跨设备 | 软链接(硬链接做不到) |
| 给目录建链接 | 软链接 |
| 想让源文件被删后还能用 | 硬链接 |
| 想让链接看起来像快捷方式 | 软链接 |
| 不知道选啥 | 软链接(更直观、用得更多) |
典型应用
1. 切换软件版本
# 装了多个 Python 版本
ls /usr/local/bin/
# python3.11 python3.12 python3.13
# 用软链接选默认
sudo ln -sf /usr/local/bin/python3.12 /usr/local/bin/python
2. 把日志聚集到一处
mkdir ~/logs
ln -s /var/log/nginx/access.log ~/logs/nginx.log
ln -s /var/log/mysql/error.log ~/logs/mysql.log
ln -s /var/log/syslog ~/logs/system.log
# 之后 cd ~/logs 一处看所有
3. dotfiles 管理
# 把家目录里的 .bashrc 链接到 git 仓库
mv ~/.bashrc ~/dotfiles/bashrc
ln -s ~/dotfiles/bashrc ~/.bashrc
# 改一次同时生效,git 也能管
操作
# 看链接指向哪
ls -l link
readlink link
readlink -f link # 解析所有中间链接,给最终绝对路径
# 修改 / 删除链接
rm link # 删除链接不影响源文件
ln -sf newsrc link # -f 强制覆盖已存在的链接
# 检测死链
find /tmp -xtype l # xtype l = 死链
下一篇:Vim 编辑器。