在同一目录中创建符号链接

在同一目录中创建符号链接

创建链接时遇到一些问题。我想创建以下内容:

ls -la /usr/pkgs/python3/
total 44
drwxr-xr-x   5 root root 4096 Sep  3  2020 .
drwxrwxr-x 259 root root 20480 Feb 16 06:49 ..
drwxr-xr-x   7 root root 4096 Jan  9  2018 3.6.3
lrwxrwxrwx   1 root root    5 Nov  8  2018 3.6.3a -> 3.6.3

我跑:

ln -s /usr/pkgs/python3/3.6.3 /usr/pkgs/python3/3.6.3a

但它创造了:

ls -la /usr/pkgs/python3/
total 0
drwxrwxr-x 3 root root 20 Mar 27 23:47 .
drwxrwxr-x 3 root root 21 Mar 27 23:47 ..
drwxrwxr-x 4 root root 41 Mar 27 23:47 3.6.3a

ls -la /usr/pkgs/python3/3.6.3a/
total 0
drwxrwxr-x 4 root root 41 Mar 27 23:47 .
drwxrwxr-x 3 root root 20 Mar 27 23:47 ..
lrwxrwxrwx 1 root root 29 Mar 27 23:48 3.6.3 -> /usr/pkgs/python3/3.6.3

请注意,我想在链接中使用实际路径,而不是像上面的示例中那样使用相对路径3.6.3a -> 3.6.3。我缺少什么?

答案1

发生这种情况是因为已经存在一个名为 的3.6.3a目录/usr/pkgs/python3/

ln命令有不止一种形式。引用POSIX规范(强调我的):

概要

ln [-fs] [-L|-P] source_file target_file
ln [-fs] [-L|-P] source_file... target_dir

描述

在第一个概要形式中,ln实用程序应在由指定的目标路径创建一个新的目录条目(链接)目标文件操作数。如果-s指定了该选项,则将为指定的文件创建符号链接源文件操作数。第一份概要表格当最终操作数未命名现有目录时应假定; ...

在第二种概要形式中,ln实用程序应创建一个新的目录条目(链接),或者如果该-s选项指定为符号链接,则为由源文件操作数,位于目标路径现存的目录命名为目标目录

如果您有一个名为 的文件(广义上:不一定是常规文件)3.6.3/usr/pkgs/python3/并且没有名为 的文件3.6.3a),那么您运行的命令将给出预期的结果。

请注意(假设3.6.3存在且不3.6.3a存在)

ln -s /usr/pkgs/python3/3.6.3 /usr/pkgs/python3/3.6.3a

创建到绝对路径的链接,同时

ln -s 3.6.3 /usr/pkgs/python3/3.6.3a

3.6.3a创建一个以名为 的文件命名的相对链接3.6.3,该文件应该与链接本身位于同一目录中。 (当然也可以用来ln -s ../path/to/3.6.3 /usr/pkgs/python3/3.6.3a建立到位于不同目录中的文件的相对链接)。
GNU 实现ln有一个-r选项,允许您从绝对路径创建相对链接:

$ cd /tmp/
$ mkdir dir dir/subdir
$ touch file
$ ln -sr /tmp/file dir/subdir/link_to_file
$ ls -gG /tmp/dir/subdir/link_to_file 
lrwxrwxrwx 1 10 Mar 28 01:31 /tmp/dir/subdir/link_to_file -> ../../file

答案2

最简单的方法是跳转到该目录并创建链接:

cd /usr/pkgs/python3/
ln -sf  3.6.3  3.6.3a
cd -

或者使用子外壳:

( cd /usr/pkgs/python3/ ; ln -sf  3.6.3  3.6.3a )

相关内容