ln 是 "link"(链接)的缩写,在 macOS 和其他 Unix-like 系统中,它用于创建指向文件或目录的链接,这类似于 Windows 中的“快捷方式”,但功能更强大、更底层,并且有两种主要类型。

ln 命令的核心作用
ln 命令的本质是为同一个文件或目录创建多个访问路径,当你创建一个链接后,你就可以通过原始路径或链接路径来访问同一个文件,这非常节省空间,并且可以组织文件。
两种类型的链接:硬链接 vs. 软链接
理解 ln 的关键在于区分两种链接类型:硬链接和软链接(也称为符号链接)。
硬链接
硬链接创建一个指向文件 inode 的新指针,可以把它想象成给同一个文件起了多个不同的名字。
特点:

- 内容相同,inode 相同:硬链接和原始文件共享同一个 inode,这意味着它们在文件系统中是同一个实体的不同入口。
- 不占用额外空间:因为它们指向同一个数据块,所以创建硬链接几乎不消耗磁盘空间。
- 对文件有效:通常不能为目录创建硬链接(以防止文件系统出现循环结构)。
- 与原始文件“绑定”:如果你删除了原始文件,只要还有一个硬链接指向它,数据就不会丢失,只有当所有硬链接都被删除后,文件数据才会被真正释放。
- 无法跨文件系统:硬链接必须在同一个文件系统(例如同一个硬盘分区)内创建。
创建硬链接:
ln 源文件名 硬链接名
示例:
# 创建一个文件 echo "Hello, World!" > my_file.txt # 创建一个硬链接 ln my_file.txt my_hard_link.txt # 查看两个文件的信息 ls -li my_file.txt my_hard_link.txt
你会看到输出中,my_file.txt 和 my_hard_link.txt 的 inode 号(第二列)是完全相同的。
# 修改硬链接的内容 echo "This is a hard link" > my_hard_link.txt # 查看原始文件的内容 cat my_file.txt # 输出: This is a hard link
你会发现原始文件的内容也跟着改变了,因为它们是同一个文件。

软链接 / 符号链接
软链接更像一个“快捷方式”,它包含一个指向原始文件路径的文本字符串。
特点:
- 独立的 inode:软链接本身是一个独立的文件,它有自己的 inode,其内容只是原始文件的路径。
- 占用少量空间:它只存储路径信息,所以占用空间非常小(几十字节)。
- 对文件和目录都有效:可以为任何文件或目录创建软链接。
- 与原始文件“解耦”:如果你删除了原始文件,软链接会立即失效(变成“断开的链接”或“红叉”链接),因为它指向的路径已经不存在了。
- 可以跨文件系统:因为软链接只是一个路径,所以它可以指向另一个硬盘、网络驱动器甚至远程服务器上的文件。
创建软链接:
ln -s 源文件或目录名 软链接名
注意: -s 选项是创建软链接的关键。
示例:
# 假设我们已经有 my_file.txt # 创建一个软链接 ln -s my_file.txt my_soft_link.txt # 查看两个文件的信息 ls -li my_file.txt my_soft_link.txt
你会看到输出中,my_file.txt 和 my_soft_link.txt 的 inode 号是不同的。my_soft_link.txt 的文件类型会显示为 l(link)。
# 查看软链接的内容 cat my_soft_link.txt # 输出: Hello, World! # 删除原始文件 rm my_file.txt # 再次尝试查看软链接 cat my_soft_link.txt # 输出: cat: my_soft_link.txt: No such file or directory
现在软链接已经失效了。
ln 命令的常用选项
| 选项 | 全称 | 描述 |
|---|---|---|
-s |
--symbolic |
创建软链接(符号链接),这是最常用的选项。 |
-f |
--force |
如果目标文件或链接已存在,则强制覆盖它,而不提示。 |
-i |
--interactive |
如果目标文件已存在,则在覆盖前提示用户确认。 |
-v |
--verbose |
显示详细的操作信息,例如创建了哪些链接。 |
-n |
--no-dereference |
当目标是一个符号链接时,将链接本身作为目标,而不是它指向的文件。 |
实用示例
示例 1:为常用命令创建别名(软链接)
假设你经常使用 code 命令来启动 VS Code,但你的终端默认没有它,你可以创建一个软链接到它的实际位置。
# 1. 找到 VS Code 的可执行文件位置(通常在 /Applications) # 在终端输入: which code # 假设输出是: /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code # 2. 在 /usr/local/bin 目录下创建一个软链接 # /usr/local/bin 通常在 PATH 环境变量中,所以这里的命令可以直接运行 sudo ln -s /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code /usr/local/bin/code # 现在你可以直接在终端输入 `code` 来启动 VS Code 了
示例 2:组织项目文件(软链接)
假设你的项目文件在 /Users/yourname/dev/project-a,但你希望能在桌面上方便地访问它。
# 在桌面上创建一个指向项目目录的软链接 ln -s /Users/yourname/dev/project-a ~/Desktop/Project-A
现在你的桌面上就有了一个名为 "Project-A" 的快捷方式,点击它就能直接进入项目目录。
示例 3:强制覆盖现有链接(结合 -f 和 -v)
# 假设已经存在一个链接 ln -s old_target my_link # 现在想更新它指向 new_target,不加 -f 会报错 ln -s new_target my_link # 输出: ln: my_link: File exists # 使用 -f 强制覆盖 ln -fv -s new_target my_link # 输出: ln: replacing 'my_link' with 'my_link'
硬链接 vs. 软链接:何时使用?
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| 使用场景 | 数据备份与冗余:确保即使一个文件被误删,其他副本依然存在。 文件组织:在不移动文件的情况下,将其放置在多个逻辑位置。 |
创建快捷方式:将常用文件或目录放在方便访问的地方。 软件部署:将程序链接到系统标准路径(如 /usr/local/bin)。跨文件系统访问:链接到不同硬盘或网络位置的文件。 |
| 安全性 | 更安全,因为数据本身仍然存在,只要还有一个硬链接,数据就不会丢失。 | 较脆弱,如果原始文件被移动或删除,链接就会失效。 |
| 兼容性 | 更底层,更接近文件系统本质。 | 更通用,类似于其他操作系统的“快捷方式”概念,更容易理解。 |
在日常使用中,超过 99% 的情况你都会使用软链接 (ln -s),它更灵活、更直观,并且可以跨文件系统,硬链接主要用于需要极高数据完整性和冗余度的特定场景。
