「ln(1)」-

  LINUX MANUAL PAGES

创建文件之间的链接

命令语法格式

ln [option]… [-T] target linkname
ln [option]… target
ln [option]… target… directory
ln [option]… -t directory target…

命令描述

命令ln用于在文件之间建立链接。默认情况下,它创建的是硬链接;如果与-s选项一起使用,则创建的是符号链接(或软链接)。

  • 如果给出两个文件名,则ln将从第二个文件创建一个指向第一个文件的链接。
  • 如果给出了一个target,ln在当前目录中创建一个指向该文件的链接。
  • 如果给出了–target-directory(-t)选项,ln会在指定的目录directory中为每一个target创建一个指向该target的链接,链接的名字为target的名称。或者如果最后一个文件是一个目录,并且没有给出–no-target-directory(-T)选项则失败。

通常,ln不会替换现有的文件。使用–force(-f)选项无条件地替换它们;使用–interactive(-i)选项来有条件地替换它们;使用–backup(-b)选项来重命名它们。除非使用–backup(-b)选项,否则不存在target不存在的瞬间,这是对POSIX的扩展。

硬链接是现有文件的另一个名称;硬链接和原文是无法进行区分的。从技术上讲,它们共享相同的inode,并且inode包含有关文件的所有信息 —— 事实上,说inode是文件并不正确。大多数系统禁止建立指向目录的硬链接;在允许的情况下,只有超级用户才可以这样做(并且要小心,因为创建一个循环的链接指向会给许多其他实用程序带来问题)。硬链接不能跨越文件系统边界。(然而,这些限制不是由POSIX授权的。)

另一方面,符号链接(软链接)是一种特殊的文件类型(并非所有的内核都支持:System V release 3(和更早的版本)系统缺少符号链接的支持),其中链接文件实际上是指不同的文件,名称。当大多数操作(打开,读取,写入等)都通过符号链接文件时,内核会自动解析链接的引用,并操作链接指向的目标。但是一些操作(例如移除)会在链接文件本身上工作,而不是在其指向的目标上工作。对于通过链接进行访问文件,符号链接的所有者和组对于文件访问没有意义,但对于从设置了有限删除位的目录中删除符号链接有影响。在GNU系统中,符号链接的权限模式位没有意义,也不能改变,但在一些BSD系统中,链接的权限模式位可以改变,并且会影响符号链接是否在文件名解析中被遍历。请参阅GNU C库参考手册中的符号链接

符号链接可以包含任意字符串;当符号链接中的字符串不解析为一个文件时,就会发生悬空符号链接。创建悬空符号链接没有限制。使用绝对或相对符号链接需要你自己权衡。绝对符号链接始终指向相同的文件,即使包含该链接指向的目录被移动。但是,如果符号链接在多台计算机上可见(例如在联网的文件系统上),则指向的文件可能并不总是相同的。相对符号链接是相对于包含该链接的目录进行解析的,并且在涉及同一设备上的文件时通常很有用,而不用考虑通过联网机器访问时该设备挂载的名称。

在与当前目录不同的位置创建相对符号链接时,符号链接的解析将不同于当前目录中相同字符串的解析度。因此,许多用户更喜欢首先将目录切换到将创建相关符号链接的位置,以便Shell的TAB补全功能(或其他文件解析)将找到与将放置在符号链接中的目标相同的目标。

命令支持的选项及含义

需要提供给长选项的参数也必须提供给相应的短选项。

-b, –backup[=method]
请参阅备份选项。对每个可能被覆盖或删除的文件进行备份。

-d, -F, –directory
允许具有适当权限的用户尝试去建立指向目录的硬链接。但是,请注意,由于系统限制该操作可能会失败,即使是超级用户也是如此。

-f, –force
删除现有的目标文件。

-i, –interactive
提示是否删除现有的目标文件。

-L, –logical
如果-s选项没有生效或失败,并且源文件是符号链接,则创建指向由符号链接引用的文件的硬链接,而不是指向符号链接的链接。

-n, –no-dereference
当最后一个操作数是一个指向目录的符号链接时,不要特别对待最后一个操作数,而是把它看作是一个普通的文件。

当target是一个实际的目录,而不是一个指向目录的符号链接时,没有歧义,我们会在目录中一个符号链接。但是,当target是指向目录的符号链接时,会有两种方法处理用户的请求:

  • ln可以像处理普通目录一样处理target,并在其中创建链接。这也是默认行为,将指向目录的符号链接视为一个普通目录。该行为不需要指定-n选项。
  • 另一方面,target可以被视为非目录(就像符号链接本身一样)。在这种情况下,ln必须在创建新链接之前删除或备份该指向目录的符号链接。该行为需要指定-n选项。

该选项比–no-target-directory(-T)选项弱,所以如果给出了这两个选项,选项-n将不起作用。

-P, –physical
如果-s选项没有生效或失败,并且源文件是符号链接,则创建符号链接本身的硬链接。在内核不支持的平台上,该选项会创建一个具有相同内容的符号链接;由于无法编辑符号链接内容,因此通过任一链接执行的任何文件名解析都将与创建硬链接相同。

-r, –relative
创建一个相对于链接位置的符号链接。如下示例:

# ln -srv /a/file /tmp

‘/tmp/file’ -> ‘../a/file’

相对符号链接基于其规范化的包含目录和规范化目标生成。即,这些文件名中的所有符号链接都将被解析。请参阅realpath(1),它可以更好地控制相对文件名的生成,如以下示例所示:

ln–relative() {


test “$1” = –no-symlinks && { nosym=$1; shift; }


target=”$1″;


test -d “$2″ && link=”$2/.” || link=”$2″


rtarget=”$(realpath $nosym -m “$target” \
–relative-to “$(dirname “$link”)”)”
ln -s -v “$rtarget” “$link”


}

-s, –symbolic
制作符号链接(软链接),而不是硬链接。此选项仅在不支持符号链接的系统上才会产生错误消息。

-S suffix, –suffix=suffix
将后缀suffix追加到使用-b生成的备份文件的后面。请参阅备份选项

-t directory, –target-directory=directory
指定链接保存到指定的目录directory中。参阅目标目录

-T, –no-target-directory
如果最后一个操作数是一个目录或者指向目录的符号链接,则不会进行特殊对待。参阅目标目录

-v, –verbose
在链接创建成功后,打印每个文件的文件名。

–help
显示帮助并退出。

–version
显示版本信息。

退出状态

退出状态为零表示成功,非零值表示失败。

注意事项

如果-L和-P都给出,则最后一个优先。如果-s也被给出,-L和-P将被忽略。如果没有给出任何选项,那么如果系统链接支持指向符号链接(如GNU系统)的硬链接,则此实现中默认为-P,如果链接遵循符号链接指向的目标(例如在BSD上),则此实现中默认为-P。

使用示例

下面是一个错误的示例:

# Create link ../a pointing to a in that directory. Not really useful because it points to itself.

ln -s a ..

下面是一个正确的示例:

# Change to the target before creating symlinks to avoid being confused.

cd ..

ln -s adir/a .

下面是一个错误的示例:

# Hard coded file names don’t move well.

ln -s $(pwd)/a /some/dir/

下面是一个正确的示例:

# Relative file names survive directory moves and alsowork across networked file systems.

ln -s afile anotherfile

ln -s ../adir/afile yetanotherfile

相关手册

link(2), symlink(2)

查看在线手册:http://www.gnu.org/software/coreutils/ln

查看info手册:info ‘(coreutils) ln invocation’

参考文献

  • man 1 ln, version GNU coreutils 8.28

更新日志

  • 09/12/2017 创建文章
  • 06/25/2018 修改文章内容,重新整理