符号链接的符号链接...部分规范化

时间:2011-07-23 07:35:42

标签: shell unix ln

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

我更喜欢“file1”符号链接包含一个相对URL到file0“../../dir1/dir2/file0”而不仅仅是“../../file1”。后者只是间接指向文件。

这样做的好方法是什么?

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

3 个答案:

答案 0 :(得分: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中),但应该是坚固的。

答案 1 :(得分:0)

不,这是如此具体,我认为你必须使用readlink并自己实现它。

答案 2 :(得分:0)

现在我记得!!我看到一个实用程序在大约15年前完成了这个!见man symlinks(1)symlinks -c。如果这不是你想要的,我想你的需求是如此具体,你必须自己编码...(如果我记得很清楚,我也做了一些实用程序来处理我的磁盘上的符号链接......)。 PERL是一种很棒的语言。