两种链接

ln source link            # 硬链接(hard link)
ln -s source link         # 软链接 / 符号链接(symbolic link)

像 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 编辑器。