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.

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.


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"

4
readlinkest votre ami.
JdeBP
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.