«трассирующая» версия readlink (1) - PullRequest
2 голосов
/ 08 января 2011

Мне нужна версия "readlink -f", которая обеспечивает трассировку каждого отдельного разрешения символической ссылки, которое она выполняет.Что-то вроде:

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

Я знаю, что использовал эту утилиту в прошлом, на Linux, а также помню, что в то время думал, что «название этого инструмента совершенно не интуитивно понятно, и я его забуду».Ну, этот день наступил.

Ответы [ 3 ]

1 голос
/ 20 февраля 2013

НИКТО НЕ ВЫИГРЫВАЕТ. Правильный ответ "namei".

0 голосов
/ 08 января 2011

Кто-нибудь играет в гольф?

#!/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);

Вывод не совсем такой, как описано, но он понятен.И выкопайте эту ненормальную рекурсивную замену регулярных выражений!

0 голосов
/ 08 января 2011

Этот ответ Serverfault (на Bash) может быть полезен (хотя он не претендует на обработку всех крайних случаев).

...