跳转到内容

ln

ln 用于在 Linux 中创建文件链接(硬链接或软链接),是管理文件引用关系的基本工具

Terminal window
ln [选项] 源文件 链接文件
参数 说明
源文件 被链接的原始文件或目录
链接文件 创建的链接名称
选项 说明
-s 创建软链接(符号链接),不加则为硬链接
-f 强制创建,若链接文件已存在则覆盖
-i 覆盖前提示确认
-v 显示详细操作信息

在 Linux 中,文件由元数据和用户数据组成。元数据中包含文件名和 inode 节点;用户数据中包含实际的文件数据。

inode 节点是每个文件在文件系统中的唯一标识,它记录了文件类型、权限信息、大小、时间戳、链接数等,但不包含文件名(文件路径)。

文件组织示意图

概念

硬链接是指多个文件名指向相同的 inode(即文件的真实数据块),它们共享同一个文件内容。

硬链接示意图.png

特点

  • 共享 inode:硬链接与源文件拥有相同的 inode 编号,指向同一份数据
  • 删除源文件不影响硬链接:只要有一个硬链接存在(inode 的引用计数大于 0),文件内容依然存在
  • 不能跨文件系统:硬链接只能在同一个文件系统(如同一分区)内创建
  • 不能指向目录:出于防止目录循环引用的考虑,Linux 不允许为目录创建硬链接
  • 权限同步:硬链接与源文件的权限、所有者等属性完全一致(因为共享 inode)

创建硬链接

Terminal window
ln 源文件 链接文件

示例

Terminal window
echo "Hello" > file.txt
ln file.txt link_hard.txt
ls -li file.txt link_hard.txt

输出:

50231 -rw-r--r-- 2 bdathe bdathe 12 Aug 5 13:44 file.txt
50231 -rw-r--r-- 2 bdathe bdathe 12 Aug 5 13:44 link_hard.txt

file.txt 和 link_hard.txt 的 inode 相同,硬链接计数是 2

概念

软链接又叫符号链接,是一个特殊类型的文件,它包含了指向原始文件路径的引用(即路径字符串),类似于 Windows 的快捷方式

软链接示意图.png

特点

  • 独立 inode:软链接有自己的 inode 编号,本质是一个包含目标路径的特殊文件
  • 依赖源文件路径:如果源文件被删除或移动,软链接会失效(显示“断链”)
  • 可跨文件系统:软链接可以指向不同分区或文件系统中的文件/目录
  • 可指向目录:允许为目录创建软链接,这是软链接与硬链接的重要区别之一
  • 权限特殊:软链接的权限总是 rwxrwxrwx,但实际权限由目标文件决定

创建软链接

Terminal window
ln -s 源文件/目录 软链接文件

示例

Terminal window
echo "Hello" > file.txt
ln -s file.txt link_soft.txt
ls -li file.txt link_soft.txt

输出:

50231 -rw-r--r-- 1 bdathe bdathe 12 Aug 5 13:44 file.txt
6324 lrwxrwxrwx 1 bdathe bdathe 8 Aug 5 13:51 link_soft.txt -> file.txt

file.txt 和 link_soft.txt 有不同的 inode 节点。

ls 工具

ls 是最常用的查看链接信息的命令:

  • -i:显示文件的 inode 编号,用于区分硬链接和软链接
  • -l:显示详细信息,软链接会显示 链接名 -> 目标路径
  • -F:在文件名后添加符号标识,软链接会加 @

readlink 工具

readlink 专门用于查看软链接指向的目标路径:

  • -f:递归解析链接,返回目标文件的绝对路径

stat 工具

stat 可以显示文件(包括链接)的详细元数据,如 inode 信息、权限、创建时间等,能更深入地区分硬链接和软链接。

find 工具

如果需要找到某个文件的所有硬链接(即共享同一 inode 的文件),可以用 find 结合 inode 编号搜索:

  • -inum:查找所有硬链接