> For the complete documentation index, see [llms.txt](https://linux-in-action.gitbook.io/project/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://linux-in-action.gitbook.io/project/wen-jian-xi-tong/ln.md).

# ln 命令

## 链接

链接文件是 Linux 文件系统的一个优势。如需要在系统上维护同一个文件的两份或多份副本，除了保存多分单独的物理文件副本之外，还可以采用保存一份物理文件副本和多个虚拟副本的方式。这种虚拟副本就称为**链接**。

链接是目录中指向文件真实位置的占位符。

在 Linux 中有两种不同类型的文件链接：

* 符号链接
* 硬链接

### 符号链接

**符号链接** 就是一个实实在在的文件，它指向存放在虚拟目录结构中某个地方的另一个文件。 这两个通过符号链接在一起的文件，彼此的内容并不相同。

要为一个文件创建符号链接，原始文件必须事先存在。

> 注意：符号链接文件不是一个独立的文件，它的许多属性依赖于源文件，所以给符号链接文件设置存取权限是没有意义的。

### 硬链接

**硬链接** 会创建独立的虚拟文件，其中包含了原始文件的信息以及位置。但是他们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。

要创建硬链接，原始文件也必须事先存在。

> 只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接，只能使用符号链接。此外，也不能对目录进行硬链接。

### 判断符号链接和硬链接

1. 在 `ls -l` 命令中，长列表中符号文件名后的 `->` 符号表明该文件是链接到后一个文件上的一个符号链接。
2. 查看inode编号。文件或目录的 inode 编号是一个用于标识的唯一数字，这个数字由内核分配给文件系统中的每一个对象。符号链接文件的 inode 和源文件的 inode 是不一样的。

## ln 命令

`ln` 命令用来为文件创件链接，默认的连接类型是硬链接。如果要创建符号链接必须使用 `-s` 选项。

### 命令用法

```
$ ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
$ ln [OPTION]... TARGET                  (2nd form)
$ ln [OPTION]... TARGET... DIRECTORY     (3rd form)
$ ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
```

其中 `TARGET` 可以理解为源文件名，`LINK_NAME` 则为链接文件名。 注意其中第三和第四种形式只能用于创建符号链接。

### 常用可选参数

| 参数          | 说明                  |
| ----------- | ------------------- |
| -d, -F      | 允许超级管理对目录进行硬链接      |
| -f, --force | 不管目标文件是否存在，强制建立链接文件 |
| -i          | 提示是否删除目标文件          |
| -s          | 建立符号链接              |
