it-swarm.cn

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

我可以做这个:

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

65
Humphrey Bogart

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

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

66
penguin359

如果您使用较新的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
25
ptr

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

12
Shadur

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

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

symlinks -c /path/to/directory

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

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

您可以尝试:

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

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

通常,相对路径名是您想要的,而ln -s 给你。我认为您想要的是:

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

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

另外,-s参数表示--symbolicln默认创建硬链接。

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

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

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

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

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

0
mreff555