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
}