1

假设我创建了一个符号链接“file2”到当前位置上方两个目录的文件“file1”(例如,“ln -s ../../file1 file2”。但现在假设“file1”也是一个符号链接到一个文件“file0”,从它的位置向下两个目录(比如它的相对路径是 dir1/dir2/file0”)。

如果“file1”符号链接包含指向file0“../../dir1/dir2/file0”而不是“../../file1”的相对URL,我更愿意。后者只是间接指向文件。

这样做的好方法是什么?

我可以用 readlink 破解一些东西。但我仍然希望有一种我没有考虑或忽略的“更好”方式。

4

3 回答 3

1

这将递归测试文件并检索完整的相对路径,然后删除不必要的“./”和“foo/../”

#!/bin/bash
linkfile="$1"
while test -L "$linkfile" ; do
linkfile="$(dirname ${linkfile})/$(readlink ${linkfile})"
done
perl -e '$x=shift; while ($x =~ s#//+#/#g) {} ; while ($x =~ s#/\./#/#g) {} ; while ($x =~ s#/([^\.]|[^\.][^/]+?|\.[^\.]+?)/\.\./#/#g) {} ; while ($x =~ s#^([^\.]|[^\.][^/]+?|\.[^\.]+?)/\.\./#/#g) {} ; $x =~ s#^\./##; print "$x\n";' "$linkfile"

如果您将其保存为“canonical.bash”,那么您将使用它

$ ln -s `canonical.bash foo` bar

正则表达式不会减少“/..x/../”和“../foo/”(如果 foo/ 在您的 $PWD 中)这样的一些情况,但应该是坚固的。

于 2011-08-01T03:24:29.177 回答
0

现在我想起了!!大约 15 年前,我看到一个实用程序可以做到这一点!看man symlinks(1)symlinks -c. 如果这不是您想要的,我想您的需求非常具体,您必须自己编写代码......(如果我没记错的话,我还制作了一些实用程序来处理我的磁盘上的符号链接......)。PERL 是一种很好的语言。

于 2011-07-23T13:45:32.090 回答
0

不,这太具体了,我认为您必须使用 readlink 并自己实现它。

于 2011-07-23T11:59:05.303 回答