假设我有一个文件和一个目录:
$ 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)
我创建了一个到file
calledsymlink1
的符号链接,以及一个到dir
called的符号链接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
选项,您可以使用它来完全规范化目标(即解析目标路径中的所有符号链接,如果目标符号链接包含其他符号链接)。
您可以cp -P
用来制作符号链接的副本:
cp -P symlink2 symlink3
Run Code Online (Sandbox Code Playgroud)
(假设symlink3
尚未作为目录或符号链接存在于目录中,请参阅-T
GNU的选项以cp
了解这些情况)。
请注意,如果符号链接的目标是相对的,如果副本与原始目录不在同一目录中,则上述内容可能会导致链接断开。
与zsh
,
ln -s -- symlink2(:P) symlink3
Run Code Online (Sandbox Code Playgroud)
将创建symlink3
为 的完整规范(无符号链接)路径的符号链接symlink2
,ln -s -- "$(readlink -f symlink2)" symlink3
但更可靠,因为如果该路径以换行符结尾,它仍然可以正常工作。
与上述相同的警告以及与 GNU 相同的工作ln
。