Як отримати повний шлях до цілі посилання


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.
користувач1686

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.