Como obter o caminho completo para o destino do link

13

Se eu tiver um link simbólico /var/opt/foocriado com ln -fs /path/to/target/dir foo. Como posso em um script que vê apenas o link /path/to/target/dir?

O que eu quero alcançar no script é rm -rf /path/to/target/dirantes de mim ln -fs /path/to/another/dir foo.

Nifle
fonte

Respostas:

30
link=/var/opt/foo

target=$(readlink "$link")

$target agora é o destino do link, exatamente como foi armazenado no sistema de arquivos.

Os links simbólicos podem ser relativos, portanto, isso seria melhor para o uso normal:

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

Observe que isso é usado readlinkno GNU Coreutils, que pode não existir no BSD e em outros sistemas.

Editar: readlink -f funciona em BSDs, desde que o destino do link exista. realpathé outra ferramenta, somente BSD, que funciona de maneira semelhante.

user1686
fonte
11
Os BSDs receberam uma readlink()chamada do sistema desde os dias de 4.2BSD. O readlink utilitário atual dos BSDs foi lançado com o FreeBSD 4.10. Foi (re) implementado como um link físico para o statcomando ( página de manual do MacOS X Página de manual do FreeBSD 9 ). Observe que ele não tem uma -mopção.
JdeBP
@JdeBP: Obrigado. Ele possui -fe readlink -ffunciona da mesma maneira (assumindo que o destino do link existe). No BSD, realpathparece ser outra alternativa para readlink -m.
User1686
0

Uma maneira é (eu estou esperando por uma versão melhor)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
fonte
4
readlinké seu amigo.
JdeBP