Un lien symbolique ne contient pas le fichier qu’il représente. Il contient une cible, parfois relative, parfois elle-même un autre lien. Quand vous devez vérifier un script, un service ou un chemin de configuration, readlink et realpath permettent de voir où vous allez réellement.
La distinction est importante avant une copie, un rm ou une modification de droits. La commande peut afficher la cible brute du lien ou reconstruire le chemin canonique jusqu’au fichier final.
Lire la cible enregistrée par le lien
Commencez par créer un exemple simple :
mkdir -p /tmp/liens-linux/dossier
printf 'contenun' > /tmp/liens-linux/dossier/cible.txt
ln -s dossier/cible.txt /tmp/liens-linux/raccourci
readlink /tmp/liens-linux/raccourci
readlink affiche ici dossier/cible.txt. Il ne transforme pas cette cible relative en chemin absolu et ne vérifie pas forcément que le fichier final existe. C’est la réponse à la question : « quelle valeur est stockée dans ce lien symbolique ? »
Pour afficher les détails du lien sans le suivre, utilisez aussi :
ls -l /tmp/liens-linux/raccourci
stat /tmp/liens-linux/raccourci
Avec ls -l, la flèche montre la cible enregistrée. Avec stat, l’option -L permet au contraire d’inspecter le fichier suivi :
stat /tmp/liens-linux/raccourci
stat -L /tmp/liens-linux/raccourci
Obtenir le chemin réel avec readlink -f ou realpath
Pour résoudre les liens relatifs, les répertoires . et .., utilisez readlink -f :
readlink -f /tmp/liens-linux/raccourci
La commande renvoie le chemin canonique du fichier, par exemple /tmp/liens-linux/dossier/cible.txt. Elle suit également une chaîne de liens. Vous pouvez vérifier ce comportement avec un second lien :
ln -s /tmp/liens-linux/raccourci /tmp/liens-linux/second-lien
readlink -f /tmp/liens-linux/second-lien
realpath sert au même besoin avec une syntaxe souvent plus lisible :
realpath /tmp/liens-linux/second-lien
La page de manuel de readlink documente les options de résolution. Celle de realpath précise notamment le comportement lorsque la cible n’existe pas.
Que faire si la cible n’existe plus ?
Un lien symbolique cassé reste présent dans le système, mais sa cible ne peut plus être atteinte :
ln -s /tmp/liens-linux/fichier-supprime /tmp/liens-linux/lien-casse
readlink /tmp/liens-linux/lien-casse
readlink -e /tmp/liens-linux/lien-casse
echo $?
readlink affiche encore la cible enregistrée. En revanche, readlink -e exige que chaque élément du chemin existe et renvoie un code différent de zéro si la résolution échoue. C’est utile dans un script qui doit arrêter l’opération avant de manipuler un mauvais chemin.
L’option -m est plus permissive : elle résout le chemin comme si les éléments absents existaient. Elle peut servir à préparer un chemin, mais elle ne prouve pas que le fichier est présent :
readlink -m /tmp/liens-linux/nouveau/repertoire/config.ini
realpath -m /tmp/liens-linux/nouveau/repertoire/config.ini
Pour un contrôle strict avant une sauvegarde ou une suppression, préférez readlink -e, puis testez le type obtenu :
chemin=$(readlink -e -- /tmp/liens-linux/raccourci) || {
printf 'Cible introuvablen' >&2
exit 1
}
printf 'La cible n’est pas un fichier réguliern' >&2
exit 1
}
printf 'Cible vérifiée : %sn' "$chemin"
Ne confondez pas le lien et le fichier final
La commande rm lien-symbolique supprime le lien, pas le fichier ciblé. Le risque arrive surtout quand un script résout d’abord le chemin avec readlink -f, puis applique une action destructive au résultat sans vérification.
Dans mon cas, je garde cette séquence avant toute modification automatisée : afficher la cible brute avec readlink, résoudre avec readlink -e, puis contrôler le chemin obtenu avec printf et test. Cette double lecture évite de prendre un lien de configuration pour le fichier qu’il pointe.
Si vous travaillez sur des liens dans /etc, un service systemd ou un dossier de sauvegarde, faites le test avec un chemin d’exemple avant de lancer la commande sur le serveur.
