GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendaftar rantai tautan simbolik?

Solusi 1:

Cukup gunakan namei :

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

Solusi 2:

readlink -e <link>

tautan baca [OPSI]... FILE

  • -e, --canonicalize-ada
    kanonikalisasi dengan mengikuti setiap symlink di setiap komponen dari nama yang diberikan secara rekursif, semua komponen harus ada
$ 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

catatan:readlink a dengan sendirinya mengembalikan b

catatan #2:bersama dengan find -l, utilitas untuk membuat daftar rantai dapat dengan mudah ditulis dalam perl, tetapi juga harus cukup pintar untuk mendeteksi loop

readlink tidak akan menampilkan apa pun jika Anda memiliki loop. Ini lebih baik daripada terjebak, kurasa.

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

Solusi 3:

Berikut adalah fungsi rekursif di 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; }

Di beberapa baris:

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
}

Contoh:

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

Ini membutuhkan stat(1) yang mungkin tidak ada di beberapa sistem.

Itu akan gagal jika nama mengandung backticks, tanda kutip tunggal, atau "->". Itu macet dalam satu lingkaran dengan loop symlink (ini bisa diselesaikan dengan menggunakan array asosiatif di Bash 4). Itu mengekspor variabel yang disebut "rantai" tanpa memperhatikan apakah itu sudah digunakan.

Mungkin ada masalah lain dengannya.

Edit:

Memperbaiki masalah dengan beberapa symlink relatif. Beberapa masih tidak berfungsi, tetapi versi di bawah ini tidak memerlukan target tautan untuk tetap ada.

Menambahkan versi yang menggunakan tautan baca:

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. Cara Membuat Tautan Keras dan Simbolik di Linux

  2. Bagaimana cara mengompres tautan simbolik?

  3. Bagaimana cara memindahkan tautan simbolik relatif?

  1. Cara membuat tautan ke direktori

  2. Bagaimana memulihkan setelah menghapus tautan simbolik libc.so.6?

  3. Bagaimana cara menghapus tautan simbolik ke direktori?

  1. Cara Mendaftar Semua Basis Data di PostgreSQL

  2. Perintah Ln:Cara Membuat Tautan Simbolik di Linux

  3. Cara Menggunakan Perintah SS Linux