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

Hum*_*art 82 symlink

我可以做这个:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt
Run Code Online (Sandbox Code Playgroud)

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

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
Run Code Online (Sandbox Code Playgroud)

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

pen*_*359 89

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

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

你可以做:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
Run Code Online (Sandbox Code Playgroud)

或者为此很重要:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt
Run Code Online (Sandbox Code Playgroud)

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

  • “该字符串被理解为符号链接父目录的相对路径” - 这解释了一切! (3认同)
  • 说得好。您在我输入自己的答案时回答了这个问题。:) (2认同)

小智 38

如果您使用较新的 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
Run Code Online (Sandbox Code Playgroud)

例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • @ivkremer 看来这个选项自 `coreutils` >= 8.16 起可用(来源:https://superuser.com/a/837935/403979) (2认同)

Sha*_*dur 13

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


Gil*_*il' 9

有一个名为symlinks(最初由 Mark Lords,现在由 J. Brandt Buckley 维护)的方便的小实用程序,存在于许多 Linux 发行版中。

要将目录中的所有绝对符号链接转换为相对链接:

symlinks -c /path/to/directory
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有转换单个链接的选项,您必须先将其移动到其自己的目录中。

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
Run Code Online (Sandbox Code Playgroud)

  • 被低估的答案。 (2认同)