2011-01-07 60 views
2

我想要一个版本的“readlink -f”,它提供了它执行的每个单独符号链接分辨率的跟踪。喜欢的东西:“跟踪”版本的readlink(1)

$ linktrace /usr/lib64/sendmail 
/usr/lib64 -> lib 
/usr/lib/sendmail -> ../sbin/sendmail 
/usr/sbin/sendmail 
$ 

我知道我已经在过去使用这个工具,在Linux上,还记得当时在想“这个工具的名称是完全不直观,我会忘记它”。那天,那天已经到了。

+0

不知道这是你要求的,但有一个libc函数`realpath`和一个同名的GNU工具。 – asveikau 2011-01-08 05:44:08

回答

1

NOBODY WINS。正确的答案是“namei”。

0

This Serverfault answer(在Bash中)可能会有所帮助(尽管它并不声称处理所有边界情况)。

+0

与Ben Jackson的尝试类似,这些脚本仅解析路径中的最后一个符号链接,而不是先前的任何“目录级别”符号链接。 “链/ usr/lib64/sendmail”只打印“/ usr/lib64/sendmail - > ../sbin/sendmail”,这是不够的。 – jonrock 2011-01-08 00:10:12

0

高尔夫球码有人吗?

#!/usr/bin/perl 

use File::Spec; 
my $g; 
my $f = shift; 
while (1) { 
    print $f; 
    $g = readlink($f); 
    last unless defined $g; 
    printf " -> %s\n", $g; 
    $f =~ s,/[^/]*$,,; 
    $f = File::Spec->rel2abs($g, $f); 
} 
print "\n"; 

好了,这个怎么样:

#!/usr/bin/perl 

use File::Spec; 

sub r { 
    my ($p, $s) = @_; 
    my $l = readlink $p; 
    if ($l) { 
     printf "%s -> %s\n", $p, $l; 
     $p =~ s,/[^/]*$,,; 
     r("",File::Spec->rel2abs($l,$p) . $s) 
    } else { 
     $s =~ s!^(/?[^/]+)(.*)! r($p.$1, $2) !e; 
    } 
} 
r("",shift); 

输出并不像描述的,但它是可以理解的。并挖掘该craaazy递归可执行正则表达式替换!

+0

不处理/ usr/lib64 - >/usr/lib步骤。 – jonrock 2011-01-07 23:18:20