建立指向相对路径名的符号链接

建立指向相对路径名的符号链接

我可以做这个:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

但我希望能够做到这一点:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

这可能吗?我可以以某种方式解析相对路径名并将其传递给吗ln

答案1

如果您创建到相对路径的符号链接,它会将其存储为相对符号链接,而不是像示例所示的绝对符号链接。这通常是一件好事。当文件系统安装在其他地方时,绝对符号链接不起作用。

您的示例不起作用的原因是它相对于符号链接的父目录而不是ln运行位置。

你可以做:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

或者对于这一点来说:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

重要的是要认识到后面的第一个参数ln -s被存储为符号链接的目标。它可以是任意字符串(唯一的限制是它不能为空且不能包含 NUL 字符),但在使用和解析符号链接时,该字符串被理解为相对路径符号链接的父目录(当它不以 开头时/)。

答案2

如果您使用较新的 coreutils(我使用的是 coreutils-8.22-11),它有一个选项可以执行此操作:

ln --help | grep relative
can hold arbitrary text; if later resolved, a relative link is
  -r, --relative              create symbolic links relative to link location

例如:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from

答案3

抱歉,没有。符号链接与链接所在的位置相关,而不是与创建链接时所在的位置相关。这种行为有几个很好的原因,其中大多数涉及挂载远程文件系统。

答案4

由于最常见的 shell 扩展路径,要创建相对符号链接,您应该引用“源路径”。

另外,-s参数的意思是--symbolic.ln默认创建硬链接。

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path

相关内容