小小白祈祷中...

ln 是 Linux 和 Unix 系统中用于创建链接文件的命令。链接文件分为两种类型:

  1. 硬链接(Hard Link):指向文件数据本身,链接与原文件共享相同的 inode。
  2. 符号链接(Symbolic Link):类似于 Windows 中的快捷方式,指向原文件的路径,而不是文件数据。

ln 命令的基本语法

1
ln [选项] 源文件 目标文件

参数说明:

  • 源文件:需要创建链接的原文件或目录。
  • 目标文件:链接文件的名称或路径。
  • 选项
    • -s:创建符号链接(软链接)。
    • -f:强制删除已有的目标链接文件。
    • -v:显示详细信息。
    • -n:在符号链接上创建新的符号链接(而不是覆盖符号链接指向的文件)。
    • -i:在覆盖目标文件时提示用户确认。
    • -T:将目标始终作为文件(强制不将目标视为目录)。

硬链接(Hard Link)

硬链接是指向同一个文件数据块的多个文件名。这些文件共享相同的 inode,因此它们是完全等价的。

硬链接的特点:

  • 硬链接与原文件共享相同的文件数据和 inode。
  • 删除硬链接或原文件不会影响文件数据,只有当所有的硬链接都删除后,数据才会被释放。
  • 硬链接只能在同一个文件系统中创建,不能跨分区。

创建硬链接

1
ln 源文件 硬链接文件
  • 示例:
1
ln file1 hardlink1
  • 查看硬链接和 inode 信息:
1
ls -li

示例输出:

1
2
123456 -rw-r--r-- 2 user group  1234 Dec 9 10:10 file1
123456 -rw-r--r-- 2 user group 1234 Dec 9 10:10 hardlink1
  • 说明:
    • 123456 是 inode 号,file1hardlink1 的 inode 相同。
    • 硬链接文件数量为 2,表示文件有两个硬链接。

符号链接(Symbolic Link)

符号链接(软链接)是一个指向目标文件路径的快捷方式,它与原文件有独立的 inode。

符号链接的特点:

  • 符号链接是一个独立的文件,内容仅是指向目标文件的路径。
  • 如果原文件被删除,符号链接会变为“断开的链接”(Broken Link),无法访问。
  • 符号链接可以跨文件系统或分区创建。

创建符号链接

1
ln -s 源文件 符号链接文件
  • 示例:
1
ln -s file1 symlink1
  • 查看符号链接信息:
1
ls -l

示例输出:

1
lrwxrwxrwx 1 user group    5 Dec 9 10:10 symlink1 -> file1
  • 说明:
    • l 表示这是一个符号链接。
    • symlink1 -> file1 表示 symlink1 指向 file1

删除链接

  • 删除硬链接或符号链接时,直接使用 rm 命令:

    1
    rm 链接文件
  • 删除链接不会删除原文件(除非原文件本身也被删除)。


目录链接

为目录创建符号链接

1
ln -s 源目录 符号链接目录
  • 示例:
1
ln -s /var/log mylog
  • 查看符号链接目录:
    1
    ls -l

示例输出:

1
lrwxrwxrwx 1 user group    8 Dec 9 10:10 mylog -> /var/log
  • 说明:mylog 是指向 /var/log 的符号链接。

硬链接不能直接用于目录

硬链接默认不能用于目录,因为这会破坏文件系统的结构(防止循环引用)。如果确实需要对目录创建硬链接,可以使用 cp 命令或高级工具(如 rsync)。


强制覆盖目标链接

如果目标链接文件已存在,可以使用 -f 选项强制覆盖:

1
ln -sf 源文件 符号链接文件
  • 示例:
1
ln -sf file2 symlink1
  • 说明:将 symlink1 强制指向新的文件 file2

常见用法示例

创建硬链接

1
ln file1 hardlink1
  • 创建一个硬链接 hardlink1,与 file1 共享同一个文件数据。

创建符号链接

1
ln -s file1 symlink1
  • 创建一个符号链接 symlink1,指向 file1

为目录创建符号链接

1
ln -s /usr/local/bin mybin
  • /usr/local/bin 目录链接到当前目录下的 mybin

强制覆盖符号链接

1
ln -sf file2 symlink1
  • 强制将 symlink1 指向 file2(即使 symlink1 已存在)。

跨分区创建链接

  • 硬链接不能跨分区:

    1
    ln /mnt/file1 /tmp/hardlink1

    错误:

    1
    ln: failed to create hard link '/tmp/hardlink1': Invalid cross-device link
  • 符号链接可以跨分区:

    1
    ln -s /mnt/file1 /tmp/symlink1

硬链接与符号链接的区别

特性 硬链接 符号链接
链接方式 指向文件数据块,直接共享 inode 指向文件路径
文件系统 必须在同一个文件系统内 可以跨文件系统或分区
删除源文件 不影响硬链接文件,文件数据仍然存在 符号链接会变为断开的链接,无法访问
支持目录 默认不支持目录硬链接(防止循环引用) 支持目录符号链接
inode 是否相同 相同 不同

查看链接信息

  • 使用 ls -li 查看文件 inode 信息:
1
ls -li
  • 示例输出:

    1
    2
    3
    123456 -rw-r--r-- 2 user group 1234 Dec 9 10:10 file1
    123456 -rw-r--r-- 2 user group 1234 Dec 9 10:10 hardlink1
    789012 lrwxrwxrwx 1 user group 5 Dec 9 10:10 symlink1 -> file1
    • file1hardlink1 的 inode 相同,表示它们是硬链接。
    • symlink1 的 inode 不同,且 -> file1 表示它是一个符号链接。

总结

  • 硬链接ln):ln 源文件 硬链接文件
  • 符号链接ln -s):ln -s 源文件 符号链接文件
  • 常用选项
    • -s:创建符号链接。
    • -f:强制覆盖目标链接。
    • -v:显示详细信息。
  • 硬链接特点
    • 同一个文件的多个名字,共享 inode。
    • 不能跨分区创建。
  • 符号链接特点
    • 独立文件,指向原文件路径。
    • 可以跨分区,也可以指向目录。

熟练使用 ln 命令,可以高效地管理文件链接和目录结构。