Jak uzyskać pełną ścieżkę do celu linku

13

Jeśli mam dowiązanie symboliczne /var/opt/fooutworzone za pomocą ln -fs /path/to/target/dir foo. Jak mogę w skrypcie, który widzi tylko link /path/to/target/dir?

To, co chcę osiągnąć w skrypcie, to rm -rf /path/to/target/dirzanim to zrobię ln -fs /path/to/another/dir foo.

Nifle
źródło

Odpowiedzi:

30
link=/var/opt/foo

target=$(readlink "$link")

$target jest teraz celem łącza, dokładnie tak, jak zostało zapisane w systemie plików.

Dowiązania symboliczne mogą być jednak względne, więc byłoby to lepsze w przypadku normalnego użytkowania:

target=$(readlink -f "$link")

Zauważ, że wykorzystuje to readlinkGNU Coreutils, które mogą nie istnieć w BSD i innych systemach.

Edycja: readlink -f działa na BSD, o ile istnieje element docelowy łącza. realpathto kolejne narzędzie tylko do BSD, które działa w podobny sposób.

użytkownik1686
źródło
1
BSD miały readlink()wywołanie systemowe od czasów 4.2BSD. Obecne readlink narzędzie BSD zostało wydane wraz z FreeBSD 4.10. Został (ponownie) zaimplementowany jako twardy link do statpolecenia ( strona podręcznika MacOS X strona podręcznika FreeBSD 9 ). Zauważ, że nie ma takiej -mopcji.
JdeBP
@JdeBP: Dzięki. Ma -fi readlink -fdziała równie dobrze (zakładając, że istnieje cel łącza). W BSD realpathwydaje się być kolejną alternatywą dla readlink -m.
user1686,
0

Jednym ze sposobów jest (mam nadzieję na lepszą wersję)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
źródło
4
readlinkjest twoim przyjacielem.
JdeBP