ln 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
ln(link,链接)——文件与目录命令族(见文件与目录命令族)。它引出 Linux 里一个核心概念:链接。
ln 创建文件的链接。Linux 里一个文件实际由 inode(索引节点,存文件元数据和数据块指针的磁盘结构)标识,目录项只是"名字→inode"的映射。链接就是让多个名字指向同一个 inode——分两种,本质大不同。
一、硬链接 vs 软链接
ln file.txt hard.txt # 硬链接(默认,无 -s)
ln -s file.txt soft.txt # 软链接(-s,symbolic)| 维度 | 硬链接(默认) | 软链接(-s) |
|---|---|---|
| 本质 | 多个名字指向同一 inode | 一个特殊文件,内容存目标路径 |
| 跨文件系统 | 不可以 | 可以 |
| 链接目录 | 不可以(通常) | 可以 |
| 原文件删除 | 数据还在(还有别的名字指向) | 变断链(dangling),指向不存在 |
| 占用 | 不额外占数据空间 | 极小(只存路径) |
这张表是理解链接的关键。硬链接是"别名"——删掉任何一个名字,数据只要还有别的名字指向就不会丢;软链接是"快捷方式"——原文件没了,它就指向虚空(断链),ls 里通常红色闪烁。日常 99% 用软链接(
-s),因为它灵活(能跨盘、能链目录)。
二、查看与解析链接
ls -l soft.txt # 显示 -> 指向
lrwxrwxrwx 1 user user 8 Aug 28 soft.txt -> file.txt
readlink soft.txt # 直接输出链接指向的路径
readlink -f soft.txt # 解析为绝对真实路径(追到底)
ls -l里l开头的是软链接,箭头指出目标。readlink 更程序化地取链接值,-f一路追到最终真实文件(穿过多层链接)。排查"这个链接到底链到哪"用readlink -f最准。
三、断链与排查
# 原文件被删,软链接断掉
ls -l broken_link # 红色,指向不存在
find /path -xtype l # 找出所有断链软链接最大的坑:原文件移动或删除后,链接 silently 断掉,程序访问时报 "No such file"。
find -xtype l能扫出目录下所有断链,清理或修复用。部署时若用软链接做"当前版本"指针(见下),回滚就是改指针,但要保证目标还在。
四、实战:版本切换指针
# 部署时 current 指向具体版本目录,回滚只需改指针
ln -sfn /opt/app/v2 /opt/app/current
# 回滚
ln -sfn /opt/app/v1 /opt/app/current这是软链接的经典部署用法:
current是个软链接,指向v1/v2实际目录,服务配置里写/opt/app/current。发布新版本后ln -sfn把指针一改即切换,回滚同样改指针——零停机、可瞬间回退。-f强制覆盖旧链接、-n避免链到目录里。
五、硬链接的用处
# 多个备份里共享同一份数据,省空间(只要不删光所有硬链接)
ln a.log b.log # 两个名字同一份数据硬链接在数据去重、多入口共享文件时有用——但现代多用
cp --reflink(写时复制)或 dedup 文件系统替代。日常几乎只碰软链接,硬链接理解原理即可,别轻易对目录用(会破坏文件系统树结构)。
相关命令
一句话总结
ln = 创建链接:默认硬链接(多名字同 inode、删源不丢数据、不可跨盘/链目录),-s 软链接(存目标路径、可跨盘链目录、源删即断链);ls -l/readlink -f 看指向、find -xtype l 找断链。日常用软链接,典型实战是 current 版本指针(改链即切换/回滚)。理解 inode 是看懂链接的关键。