假设我有一个文件和一个目录:
$ 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
我创建了一个file
被调用的符号链接symlink1
,以及一个被dir
调用的符号链接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
现在我创建了symlink1
使用ln -s
and 的符号链接ln -sL
:
$ ln -s symlink1 symlink2
$ ln -sL symlink1 symlink3
$ ln -s dirslink1 dirslink2
$ ln -sL dirslink1 dirslink3
现在,据我了解,symlink3
应该指向file
并且dirslink3
应该指向dir
。但是当我检查它时,没有一个symlink[23]
anddirslink[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
问题是:是否可能/如何使用另一个符号链接创建到原始文件的符号链接?
答案1
-L
仅适用于硬链接;作为POSIX 中指定:
如果-s指定选项后,-L和-P选项将被默默地忽略。
如果你有,readlink
你可以使用它:
ln -s -- "$(readlink symlink1)" symlink4
如果您readlink
支持该-f
选项,您可以使用它来完全规范化目标(IE解析目标路径中的所有符号链接(如果目标符号链接包含其他符号链接)。
答案2
您可以使用cp -P
来制作符号链接的副本:
cp -P symlink2 symlink3
(假设symlink3
尚不存在目录或目录符号链接,请参阅-T
GNU 的选项cp
来了解这些情况)。
请注意,如果符号链接的目标是相对的,并且副本与原始目录不在同一目录中,则上述内容可能会导致链接损坏。
和zsh
,
ln -s -- symlink2(:P) symlink3
将创建symlink3
为 的完整规范(无符号链接)路径的符号链接symlink2
,类似ln -s -- "$(readlink -f symlink2)" symlink3
但更可靠,因为如果该路径以换行符结尾,它仍然可以正常工作。
与上面相同的警告和 GNU 的相同解决方法ln
。