Comment obtenir le chemin complet vers la cible du lien

13

Si j'ai un lien symbolique /var/opt/foocréé avec ln -fs /path/to/target/dir foo. Comment puis-je dans un script qui ne voit que le lien obtenir /path/to/target/dir?

Ce que je veux réaliser dans le script, c'est rm -rf /path/to/target/diravant moi ln -fs /path/to/another/dir foo.

Nifle
la source

Réponses:

30
link=/var/opt/foo

target=$(readlink "$link")

$target est désormais la cible du lien, exactement comme il était stocké dans le système de fichiers.

Les liens symboliques peuvent être relatifs, cependant, ce serait mieux pour une utilisation normale:

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

Notez que cela utilise readlinkde GNU Coreutils, qui peut ne pas exister dans BSD et d'autres systèmes.

Edit: readlink -f fonctionne sur les BSD, tant que la cible du lien existe. realpathest un autre outil, uniquement BSD, qui fonctionne de manière similaire.

user1686
la source
1
Les BSD ont eu un readlink()appel système depuis l'époque de 4.2BSD. L' readlink utilitaire BSD actuel a été publié avec FreeBSD 4.10. Il a été (re) implémenté en tant que lien dur pour la statcommande ( page de manuel MacOS X page de manuel FreeBSD 9 ). Notez qu'il n'a pas d' -moption.
JdeBP
@JdeBP: Merci. Il a -fet readlink -ffonctionne aussi bien (en supposant que la cible du lien existe). Dans BSD, realpathsemble être une autre alternative à readlink -m.
user1686
0

Une façon est (j'espère une meilleure version)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
la source
4
readlinkest votre ami.
JdeBP