2011-01-07 83 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