进行符号链接到相对路径名


64

我可以做这个:

$ 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吗?


但是,使用所描述的行为可以解决的问题是什么?
forcefsck

好吧,假设您提供了一个压缩文件夹供下载,并想提供可复制复制的说明,说明如何符号链接该文件夹的某些文件。
汉弗莱·鲍格

2
ln -s $(pwd)/bar.txt ~/或包含安装脚本。
forcefsck

2
该链接实际上存储您在命令行上使用的名称。该名称到文件的解析是相对于链接位置完成的。您必须使用ln -s foo/bar.txt /home/beau/bar.txt
pqnet

Answers:


62

如果创建到相对路径的符号链接,它将把它存储为相对符号链接,而不是如示例所示的绝对路径。这通常是一件好事。当文件系统挂载在其他位置时,绝对符号链接不起作用。

您的示例不起作用的原因是,它相对于符号链接的父目录而不是在何处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字符),但是在使用和解析符号链接时,该字符串被理解为指向字符串的相对路径。 symlink的父目录(不以开头/)。


2
很好说。当我输入自己的答案时,您回答了这个问题。:)
Shadur 2011年

我只是有一个稍微不同的问题-这可以完美回答。我想知道如何在symlink中引用主目录,这样当我将其从一个用户转移到另一个用户时,它就可以工作。我不确定类似的东西~是否会起作用。

“该字符串被理解为符号链接的父目录的相对路径”-这说明了一切!
Bojan Komazec

24

如果您使用较新的coreutils(我正在使用coreutils-8.22-11),则可以选择执行以下操作:

ln --help | grep relative

可以容纳任意文本;如果以后解析,则相对链接为-r,-relative创建相对于链接位置的符号链接

例如:

$ 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

嗯,对我来说似乎没有这样的选择-r。虽然使用Mac。
ivkremer,2016年

1
@ivkremer似乎此选项可用,因为coreutils> = 8.16(来源:superuser.com/a/837935/403979
DJCrashdummy17年

使用相对标志似乎可以解决我遇到的“太多级别的符号链接”问题。
Vix

12

抱歉,没有。符号链接是相对于链接所在的位置的,而不是相对于创建链接时的位置。出现这种现象的原因有很多,其中大多数与挂载远程文件系统有关。


7

symlinks在许多Linux发行版中都有一个便捷的小工具(最初由Mark Lords负责,现在由J. Brandt Buckley维护)。

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

symlinks -c /path/to/directory

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

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

谢谢。在github上可用的符号链接。由J. Brandt Buckley维护。v1.4.3
Evgeny Vereshchagin

3

您可以尝试:

ln -s `pwd`/bar.txt /home/beau/bar.txt

但是,它建立了指向绝对路径名的符号链接。您的文字问题要求提及相对路径名...

通常,相对路径名是您想要的,并且可以ln -s为您提供。我认为您想要的是:

cd /home/beau
ln -s foo/bar.txt bar.txt

1

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

同样,该-s参数表示--symbolicln默认情况下创建硬链接。

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

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

0

如果确定没有更改挂载点的机会,则可以在bash shell中实现您要执行的操作,如下所示:

ln -s `pwd`/bar.txt ~/bar.txt

假定进行符号链接时您位于目标目录中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.