GNU/Linux >> Znalost Linux >  >> Linux

Jak vypsat symbolické článkové řetězy?

Řešení 1:

Stačí použít namei :

$ namei d
f: d
 l d -> c
   l c -> b
     l b -> a
       d a

Řešení 2:

readlink -e <link>

readlink [OPTION]... FILE

  • -e, --canonicalize-existující
    kanonizovat rekurzivním sledováním každého symbolického odkazu v každé komponentě daného jména, všechny komponenty musí existovat
$ 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

poznámka:readlink a sám o sobě vrátí b

poznámka č. 2:společně s find -l může být nástroj pro výpis řetězců snadno napsán v perlu, ale také musí být dostatečně chytrý, aby detekoval smyčky

readlink nevypíše nic, pokud máte smyčku. To je lepší než se zaseknout, myslím.

[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)

Řešení 3:

Zde je rekurzivní funkce v 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; }

Na více řádcích:

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
}

Příklady:

$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a

Vyžaduje stat(1) který nemusí být v některých systémech přítomen.

Selže, pokud názvy obsahují zpětné značky, jednoduché uvozovky nebo "->". Uvízne ve smyčce se smyčkami symbolických odkazů (to by se dalo vyřešit pomocí asociativního pole v Bash 4). Exportuje proměnnou nazvanou „řetězec“ bez ohledu na to, zda se již používá.

Mohou s tím být i jiné problémy.

Upravit:

Opraven problém s některými relativními symbolickými odkazy. Některé stále nefungují, ale níže uvedená verze nevyžaduje, aby cíl odkazu existoval.

Přidána verze, která používá readlink:

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. Jak vytvořit pevné a symbolické odkazy v Linuxu

  2. Jak komprimovat symbolický odkaz?

  3. Jak odstranit symbolický odkaz na adresář?

  1. Jak přesunu relativní symbolický odkaz?

  2. Jak vytvořit odkaz na adresář

  3. Jak obnovit po smazání symbolického odkazu libc.so.6?

  1. Jak vypsat všechny databáze v PostgreSQL

  2. Příkaz Ln:Jak vytvořit symbolické odkazy v Linuxu

  3. Jak používat příkaz Linux SS