创建文件之间的链接
命令语法格式
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
创建一个相对于链接位置的符号链接。如下示例:
‘/tmp/file’ -> ‘../a/file’
相对符号链接基于其规范化的包含目录和规范化目标生成。即,这些文件名中的所有符号链接都将被解析。请参阅realpath(1),它可以更好地控制相对文件名的生成,如以下示例所示:
test “$1” = –no-symlinks && { nosym=$1; shift; }
target=”$1″;
test -d “$2″ && link=”$2/.” || link=”$2″
rtarget=”$(realpath $nosym -m “$target” \
}
-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。
使用示例
下面是一个错误的示例:
ln -s a ..
下面是一个正确的示例:
cd ..
ln -s adir/a .
下面是一个错误的示例:
ln -s $(pwd)/a /some/dir/
下面是一个正确的示例:
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 修改文章内容,重新整理