ln:使用另一个符号链接创建符号链接

mrc*_*_kr 5 ln

假设我有一个文件和一个目录:

$ ls -l
total 4
drwxrwxr-x. 2 user user 4096 Oct  8 09:53 dir
-rw-rw-r--. 1 user user    0 Oct  8 09:53 file
Run Code Online (Sandbox Code Playgroud)

我创建了一个到filecalledsymlink1的符号链接,以及一个到dircalled的符号链接dirslink1

$ ls -l
drwxrwxr-x. 2 user user 4096 Oct  8 09:53 dir
lrwxrwxrwx. 1 user user    3 Oct  8 10:03 dirslink1 -> dir
-rw-rw-r--. 5 user user    0 Oct  8 09:53 file
lrwxrwxrwx. 1 user user    4 Oct  8 09:53 symlink1 -> file
Run Code Online (Sandbox Code Playgroud)

现在我创建了symlink1使用ln -s和的符号链接ln -sL

$ ln -s symlink1 symlink2
$ ln -sL symlink1 symlink3
$ ln -s dirslink1 dirslink2
$ ln -sL dirslink1 dirslink3
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,symlink3应该指向file并且dirslink3应该指向dir. 但是当我检查它时,没有一个symlink[23]dirslink[23]指向原始文件或目录:

$ ls -l
drwxrwxr-x. 2 user user 4096 Oct  8 09:53 dir
lrwxrwxrwx. 1 user user    3 Oct  8 10:03 dirslink1 -> dir
lrwxrwxrwx. 1 user user    9 Oct  8 10:03 dirslink2 -> dirslink1
lrwxrwxrwx. 1 user user    9 Oct  8 10:03 dirslink3 -> dirslink1
-rw-rw-r--. 5 user user    0 Oct  8 09:53 file
lrwxrwxrwx. 1 user user    4 Oct  8 09:53 symlink1 -> file
lrwxrwxrwx. 1 user user    8 Oct  8 09:54 symlink2 -> symlink1
lrwxrwxrwx. 1 user user    8 Oct  8 09:54 symlink3 -> symlink1
Run Code Online (Sandbox Code Playgroud)

问题是:是否有可能/如何使用另一个符号链接创建指向原始文件的符号链接?

Ste*_*itt 10

-L仅适用于硬链接;如POSIX 中所述

如果指定了-s选项,则应静默忽略-L-P选项。

如果你有readlink你可以使用它:

ln -s -- "$(readlink symlink1)" symlink4
Run Code Online (Sandbox Code Playgroud)

如果您readlink支持该-f选项,您可以使用它来完全规范化目标(解析目标路径中的所有符号链接,如果目标符号链接包含其他符号链接)。


Sté*_*las 5

您可以cp -P用来制作符号链接的副本:

cp -P symlink2 symlink3
Run Code Online (Sandbox Code Playgroud)

(假设symlink3尚未作为目录或符号链接存在于目录中,请参阅-TGNU的选项以cp了解这些情况)。

请注意,如果符号链接的目标是相对的,如果副本与原始目录不在同一目录中,则上述内容可能会导致链接断开。

zsh,

ln -s -- symlink2(:P) symlink3
Run Code Online (Sandbox Code Playgroud)

将创建symlink3为 的完整规范(无符号链接)路径的符号链接symlink2ln -s -- "$(readlink -f symlink2)" symlink3但更可靠,因为如果该路径以换行符结尾,它仍然可以正常工作。

与上述相同的警告以及与 GNU 相同的工作ln