Как получить полный путь к целевой ссылке

13

Если у меня есть символическая ссылка, /var/opt/fooсозданная с ln -fs /path/to/target/dir foo. Как я могу в скрипт, который видит только ссылку получить /path/to/target/dir?

То, чего я хочу достичь в сценарии, это rm -rf /path/to/target/dirдо того, как я это сделаю ln -fs /path/to/another/dir foo.

Nifle
источник

Ответы:

30
link=/var/opt/foo

target=$(readlink "$link")

$target теперь является целью ссылки в точности так, как она была сохранена в файловой системе.

Симлинки могут быть относительными, так что это было бы лучше для обычного использования:

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

Обратите внимание, что это использует readlinkиз GNU Coreutils, который может не существовать в BSD и других системах.

Редактировать: readlink -f работает на BSD, пока существует цель ссылки. realpathэто другой, только для BSD, инструмент, который работает аналогичным образом.

user1686
источник
1
У BSD был readlink()системный вызов со времен 4.2BSD. Текущая readlink утилита BSD была выпущена с FreeBSD 4.10. Он был (пере) реализован как жесткая ссылка для statкоманды ( страница руководства MacOS X Страница руководства FreeBSD 9 ). Обратите внимание, что у него нет -mвыбора.
JdeBP
@JdeBP: Спасибо. Он есть -fи readlink -fработает так же хорошо (при условии, что цель ссылки существует). В BSD, realpathпохоже, еще одна альтернатива readlink -m.
user1686
0

Один из способов (я надеюсь на лучшую версию)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
источник
4
readlinkтвой друг.
JdeBP