ln 命令是 "link" 的缩写,它的核心功能是为文件或目录创建链接,在 AIX(以及所有遵循 POSIX 标准的 Unix-like 系统,如 Linux)中,链接分为两种主要类型:硬链接和符号链接(也称为软链接),理解这两者的区别是掌握 ln 命令的关键。

硬链接
工作原理
硬链接是为文件在文件系统中创建一个额外的名称或入口,它不创建一个新文件,而是创建一个新的目录项,指向同一个 inode,inode 是存储文件元数据(如所有者、权限、大小、数据块位置等)的数据结构。
特点
- 指向同一个 inode:多个硬链接指向同一个 inode,因此它们是完全等价的。
- 不能跨越文件系统:因为 inode 是特定于文件系统的,所以硬链接不能在不同的文件系统(
/home和/var)之间创建。 - 不能为目录创建:在 AIX 和大多数 Unix 系统中,出于文件系统结构完整性的考虑,普通用户不能为目录创建硬链接。
- 与原文件互为镜像:删除任何一个硬链接,只要还有其他硬链接存在,文件的数据和元数据就不会受影响,只有当所有指向该 inode 的链接都被删除后,文件空间才会被释放。
语法
ln [源文件] [链接名称]
示例
假设我们有一个文件 report.txt。
# 创建一个名为 report_backup.txt 的硬链接 $ ln report.txt report_backup.txt # 查看文件信息,可以看到它们拥有相同的 inode 号 $ ls -li total 8 123456 -rw-r--r-- 2 myuser mygroup 1024 Oct 26 10:30 report.txt 123456 -rw-r--r-- 2 myuser mygroup 1024 Oct 26 10:30 report_backup.txt # 注意:这里的 "2" 表示有两个链接指向这个 inode。
符号链接
工作原理
符号链接(软链接)更像是一个快捷方式或一个指针,它是一个特殊的文件,其内容包含了另一个文件或目录的路径名。
特点
- 指向路径名:它存储的是一个指向目标文件路径的字符串,而不是 inode。
- 可以跨越文件系统:因为它是路径,所以可以链接到任何文件系统中的任何文件或目录。
- 可以为目录创建:可以轻松地为目录创建符号链接。
- 与原文件不是镜像:如果删除原始文件,符号链接会失效(变成 "dangling link"),因为它指向的路径已经不存在了,此时尝试访问符号链接会得到 "No such file or directory" 错误。
- 有自己的 inode 和权限:符号链接本身是一个文件,有自己的 inode 和权限(通常是
lrwxrwxrwx)。
语法
ln -s [源文件或目录] [链接名称]
重要提示:在 AIX 中,
-s选项是创建符号链接的标准方式。(图片来源网络,侵删)
示例
假设我们有一个目录 project_alpha。
# 为目录 project_alpha 创建一个名为 pa 的符号链接 $ ln -s project_alpha pa # 查看文件信息,可以看到它们有不同的 inode,pa 的类型是 'l' (link) $ ls -li total 8 234567 drwxr-xr-x 5 myuser mygroup 4096 Oct 26 10:35 project_alpha 345678 lrwxrwxrwx 1 myuser mygroup 12 Oct 26 10:36 pa -> project_alpha # 注意:pa 的链接数是 "1",它本身就是一个文件,箭头 -> 显示了它指向的目标。
ln 命令的主要选项
| 选项 | 描述 | 示例 |
|---|---|---|
-s |
创建符号链接(软链接),这是最常用的选项。 | ln -s target_file soft_link |
-f |
强制,如果目标链接名称已存在,则先删除它,再创建新的链接。 | ln -f source_file existing_link |
-n |
不覆盖符号链接,如果目标是一个已存在的符号链接,则不进行覆盖,与 -f 相对。 |
ln -n source_file existing_symlink |
-v |
详细,显示创建链接的详细信息。 | ln -v source_file new_link |
-F |
智能处理,如果目标是一个目录,则在该目录中创建链接,如果目标是一个符号链接,则跟随链接指向的文件。 | ln -F source_file destination |
实用场景和示例
场景1:为常用命令创建别名(符号链接)
你希望系统中有 vim 命令,但系统中只有 vi。
# 创建一个指向 /usr/bin/vi 的符号链接 vim $ ln -s /usr/bin/vi /usr/local/bin/vim
在 /usr/local/bin 目录下执行 vim 命令,实际运行的就是 vi。
场景2:将文件移动到不同位置但保持路径可用(符号链接)
一个应用程序将其日志文件存储在 /var/log/myapp/,但你想将它移动到 /home/myuser/logs/ 以节省根分区空间。

# 1. 移动文件 $ mv /var/log/myapp/app.log /home/myuser/logs/ # 2. 在原位置创建一个指向新位置的符号链接 $ ln -s /home/myuser/logs/app.log /var/log/myapp/app.log
应用程序仍然可以往 /var/log/myapp/app.log 写日志,但实际数据存储在 /home/myuser/logs/ 中。
场景3:节省磁盘空间(硬链接)
你有一个很大的日志文件 large_file.log,需要创建一个备份用于分析,但不想占用双倍磁盘空间。
# 创建硬链接 $ ln large_file.log large_file_backup.log # 两个文件占用完全相同的磁盘空间 $ du -sh * 1G large_file.log 1G large_file_backup.log # 总共只占 1G,而不是 2G
AIX 中的注意事项
- 权限:创建硬链接需要对源文件所在的目录有读和执行权限,创建符号链接只需要对源文件所在的目录有读和执行权限。
ln -s的默认行为:在 AIX 中,ln -s的目标名称是一个已存在的目录,默认行为是在该目录下创建一个与源文件同名的链接,这与某些 Linux 发行版的行为可能不同(后者可能会报错或覆盖)。- 示例:
$ mkdir mydir $ echo "hello" > my_file.txt # 在 mydir 目录下创建一个名为 my_file.txt 的符号链接,指向外部的 my_file.txt $ ln -s my_file.txt mydir/ $ ls -l mydir/ lrwxrwxrwx 1 myuser mygroup 9 Oct 26 10:40 my_file.txt -> my_file.txt
如果你想强制覆盖一个已存在的目录,需要使用
-f选项。
- 示例:
如何选择?
| 特性 | 硬链接 | 符号链接 |
|---|---|---|
| 本质 | 同一个文件的多个名字 | 指向另一个文件路径的快捷方式 |
| 跨文件系统 | 否 | 是 |
| 链接目录 | 否 | 是 |
| 删除源文件 | 其他链接不受影响 | 链接失效 |
| 空间占用 | 共享,不增加 | 链接本身占用少量空间 |
| 适用场景 | 同一文件系统内,需要多个等价入口,节省空间 | 跨文件系统、创建目录别名、在不移动文件的情况下改变访问路径 |
掌握 ln 命令,特别是硬链接和符号链接的区别,是进行高效 AIX 系统管理和文件操作的基础技能。

