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


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.

Ответы:


30
link=/var/opt/foo

target=$(readlink "$link")

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

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

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

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

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


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"

4
readlinkтвой друг.
JdeBP
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.