GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie listet man symbolische Linkketten auf?

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ück

Anmerkung #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
}

Linux
  1. So erstellen Sie harte und symbolische Links in Linux

  2. Wie komprimiert man einen symbolischen Link?

  3. Wie verschiebe ich einen relativen symbolischen Link?

  4. Wie nach dem Löschen des symbolischen Links libc.so.6 wiederherstellen?

  5. Wie entferne ich einen symbolischen Link zu einem Verzeichnis?

Wie man Cron-Jobs unter Linux auflistet

So erstellen Sie einen symbolischen Link in Linux mit dem Ln-Befehl

So listen Sie installierte Pakete in Linux auf

Linux ln – So erstellen Sie einen symbolischen Link in Linux [Beispiel-Bash-Befehl]

Was sind symbolische Links in Linux? Wie erstellt man symbolische Links?

So erhalten Sie eine Liste symbolischer Links unter Linux