Lösung 1:
Verwenden Sie einfach namei
:
$ namei d
f: d
l d -> c
l c -> b
l b -> a
d a
Lösung 2:
readlink -e <link>
readlink [OPTION]... DATEI
- -e, --canonicalize-existing
kanonisieren, indem Sie rekursiv jedem symbolischen Link in jeder Komponente des angegebenen Namens folgen, alle Komponenten müssen vorhanden sein
$ mkdir testlink
$ cd testlink
[email protected]:~/testlink$ ln -s c b
[email protected]:~/testlink$ ln -s b a
[email protected]:~/testlink$ ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
[email protected]:~/testlink$ echo foo > c
[email protected]:~/testlink$ cat a
foo
[email protected]:~/testlink$ readlink -e a
/home/pjb/testlink/c
Hinweis:readlink a selbst gibt b
zurückAnmerkung #2:Zusammen mit find -l könnte ein Dienstprogramm zum Auflisten der Ketten leicht in Perl geschrieben werden, muss aber auch schlau genug sein, um Schleifen zu erkennen
readlink gibt nichts aus, wenn Sie eine Schleife haben. Das ist besser als stecken zu bleiben, nehme ich an.
[email protected]:~/testlink$ ln -sf a c
[email protected]:~/testlink$ ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a
[email protected]:~/testlink$ readlink -e a
[email protected]:~/testlink$ # (note: no output)
Lösung 3:
Hier ist eine rekursive Funktion in Bash:
chain() { export chain; local link target; if [[ -z $chain ]]; then chain="$1"; fi; link=$(stat --printf=%N $1); while [[ $link =~ \-\> ]]; do target="${link##*\`}"; target="${target%\'}"; chain+=" -> $target"; chain "$target"; return; done; echo "$chain"; unset chain; }
Auf mehreren Zeilen:
chain() {
export chain
local link target
if [[ -z $chain ]]
then
chain="$1"
fi
link=$(stat --printf=%N "$1")
while [[ $link =~ \-\> ]]
do
target="${link##*\`}"
target="${target%\'}"
chain+=" -> $target"
if [[ ! $target =~ / && $1 =~ / ]]
then
target="${1%/*}/$target"
fi
chain "$target"
return
done
echo "$chain"
unset chain
}
Beispiele:
$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a
Es erfordert stat(1)
die auf einigen Systemen möglicherweise nicht vorhanden sind.
Es schlägt fehl, wenn Namen Backticks, einfache Anführungszeichen oder "->" enthalten. Es bleibt in einer Schleife mit Symlink-Schleifen hängen (dies könnte mit einem assoziativen Array in Bash 4 gelöst werden). Es exportiert eine Variable namens "Kette", ohne Rücksicht darauf, ob sie bereits verwendet wird.
Es kann andere Probleme damit geben.
Bearbeiten:
Ein Problem mit einigen relativen Symlinks wurde behoben. Einige funktionieren immer noch nicht, aber die Version unten erfordert nicht, dass das Ziel des Links existiert.
Eine Version hinzugefügt, die readlink verwendet:
chain ()
{
export chain;
local target;
if [[ -z $chain ]]; then
chain="$1";
fi;
target=$(readlink "$1");
while [[ $target ]]; do
chain+=" -> $target";
if [[ ! $target =~ / && $1 =~ / ]]
then
target="${1%/*}/$target"
fi
chain "$target";
return;
done;
echo "$chain";
unset chain
}