创建链接时遇到一些问题。我想创建以下内容:
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 )