Linux / Commande ln : créer des liens physiques et symboliques

La commande GNU ln crée par défaut un lien physique, un second nom pour le même fichier et le même inode. Avec -s, elle crée un lien symbolique, un fichier distinct qui contient le chemin de sa cible. Le premier reste limité au même système de fichiers ; le second peut pointer vers un dossier ou traverser cette limite, mais devient cassé si son chemin ne se résout plus.

Pour choisir et vérifier le bon lien, il faut distinguer la donnée partagée de la chaîne de chemin enregistrée. Les exercices utilisent uniquement un dossier temporaire sous votre compte. Les options décrites suivent le manuel officiel GNU Coreutils pour ln ; contrôlez ln --help et man ln sur le système où vous les exécuterez.

Lien physique ou lien symbolique : que se passe-t-il si l’original disparaît ?

Critère Lien physique, sans -s Lien symbolique, avec -s
Ce qui est créé Un autre nom pour le même inode et les mêmes données. Un fichier qui contient un chemin vers la cible.
Si le nom d’origine est supprimé Les données restent accessibles tant qu’un autre lien physique existe et que le fichier n’est pas autrement retiré. Le lien devient cassé si le chemin enregistré ne mène plus à une cible.
Portée Même système de fichiers ; les liens physiques vers les dossiers sont généralement interdits. Peut viser un dossier, un autre système de fichiers ou même un chemin qui n’existe pas encore.
Usage courant Deux noms d’un même fichier ordinaire lorsque les deux chemins restent sur le même système de fichiers. Pointeur vers une version de programme ou une arborescence que l’on peut déplacer ensemble.

Un lien physique n’est pas une sauvegarde indépendante : une modification du contenu par l’un des noms touche le même fichier. Pour obtenir deux contenus qui pourront diverger, copiez le fichier avec cp. Un lien symbolique ne transporte pas la cible ; déplacer seulement le lien ou supprimer sa cible peut donc le casser. Vérifiez aussi les droits d’accès de la cible et des répertoires qui mènent à elle.

Quelle syntaxe et quel ordre des arguments ?

ln [OPTION]... CIBLE NOM_DU_LIEN
ln [OPTION]... CIBLE... RÉPERTOIRE
ln [OPTION]... -t RÉPERTOIRE CIBLE...

Dans la première forme, CIBLE est le fichier visé et NOM_DU_LIEN le nouveau chemin. Avec plusieurs cibles et un dossier final, chaque lien reprend le nom de sa cible dans ce dossier. Entourez de guillemets les chemins contenant des espaces et placez -- avant les chemins susceptibles de commencer par un tiret. Pour créer un lien symbolique, ajoutez -s. L’absence de -s demande un lien physique et une cible existante admissible.

Créer et contrôler les deux liens dans un dossier d’essai

Copiez ce bloc dans un shell compatible Bash ou POSIX. mktemp réserve un nouveau dossier sous votre répertoire personnel ; les trois fichiers créés sont de simples données de démonstration et aucune commande ne nécessite sudo.

lab=$(mktemp -d "$HOME/ln-lab.XXXXXX") || exit 1
printf 'version A\n' > "$lab/data.txt"
ln -- "$lab/data.txt" "$lab/hard.txt"
ln -s -- data.txt "$lab/shortcut.txt"
stat -c '%i %h %n' "$lab/data.txt" "$lab/hard.txt"
readlink -- "$lab/shortcut.txt"
cat -- "$lab/hard.txt" "$lab/shortcut.txt"

Les deux premières lignes de stat doivent présenter le même numéro d’inode, et le nombre de liens doit être au moins 2 dans ce dossier d’essai. readlink affiche la chaîne data.txt stockée dans le lien symbolique, tandis que cat lit deux fois « version A ». Les numéros d’inode eux-mêmes varient ; comparez-les entre eux plutôt que de chercher une valeur précise. Sur un système de fichiers ou une couche d’émulation qui ne permet pas les liens, l’exercice peut échouer : ce n’est pas une raison pour le relancer avec des privilèges élevés.

Pour observer la différence sans toucher à une vraie donnée, vous pouvez ensuite supprimer seulement "$lab/data.txt" : "$lab/hard.txt" reste lisible, alors que "$lab/shortcut.txt" pointe vers un nom désormais absent. Faites ce test uniquement après les autres blocs ci-dessous, qui utilisent encore data.txt, ou dans un deuxième dossier d’essai. Le guide de la commande readlink détaille la résolution des cibles symboliques.

Créer un lien symbolique relatif sans se tromper de dossier

Un chemin relatif stocké dans un lien se résout depuis le dossier contenant le lien, pas depuis le répertoire courant du shell. C’est utile quand l’arborescence qui contient cible et lien doit être déplacée ensemble. L’option GNU -r, à utiliser avec -s, calcule ce chemin relatif à partir des chemins résolus. Vérifiez d’abord que les dossiers et la cible existent :

mkdir -p -- "$lab/releases" "$lab/app"
printf 'release A\n' > "$lab/releases/version-a"
ln -sr -- "$lab/releases/version-a" "$lab/app/current"
readlink -- "$lab/app/current"
cat -- "$lab/app/current"

Dans cet exemple, readlink doit afficher un chemin relatif vers version-a, généralement ../releases/version-a, et cat affiche « release A ». L’option -r est une extension GNU ; pour un script destiné à d’autres systèmes, calculez le chemin depuis le dossier du lien et testez-le sur la plateforme cible. Un lien absolu convient lorsque la cible doit rester un chemin fixe du système, même si le dossier du lien se déplace. Il peut toutefois viser un autre fichier sur une autre machine partageant la même arborescence apparente.

Remplacer un lien existant sans viser un vrai dossier

ln refuse normalement de remplacer un chemin existant. -f autorise le remplacement ; -i demande une réponse interactive et -b sauvegarde l’ancienne destination selon les règles GNU. Si la destination est un lien symbolique vers un dossier, -n la traite comme un lien et non comme ce dossier ; -T indique que le dernier argument est exactement le chemin à remplacer. Examinez toujours le chemin avant d’employer -f dans un déploiement.

Le bloc suivant reste dans le dossier d’essai. Il vérifie d’abord que current est bien un lien symbolique, crée une seconde version, remplace le lien par un chemin relatif vers elle, puis restaure la version A. Ne transposez pas la commande à un chemin de production sans sauvegarde et vérification de la réponse du service.

printf 'release B\n' > "$lab/releases/version-b"
test -L "$lab/app/current" || { printf 'Lien attendu absent\n' >&2; exit 1; }
readlink -- "$lab/app/current"
ln -srfT -- "$lab/releases/version-b" "$lab/app/current"
readlink -- "$lab/app/current"
cat -- "$lab/app/current"
ln -srfT -- "$lab/releases/version-a" "$lab/app/current"
cat -- "$lab/app/current"

La première lecture donne la version A, la lecture après changement donne « release B », puis la dernière donne « release A ». GNU ln peut éviter une courte absence du chemin lors d’un remplacement sans sauvegarde, mais cela ne rend pas atomique le déploiement de plusieurs fichiers ni le redémarrage d’un service. Une politique de sauvegarde et un contrôle applicatif restent nécessaires.

Reconnaître un lien cassé et inspecter sa cible

Un lien symbolique peut être créé avant sa cible. Dans le dossier d’essai, le test -L détecte le lien lui-même alors que -e échoue si le chemin final n’existe pas. readlink sans option affiche simplement la chaîne enregistrée ; readlink -e exige une résolution jusqu’à une cible existante.

ln -s -- missing.txt "$lab/broken"
readlink -- "$lab/broken"
if test -L "$lab/broken" && ! test -e "$lab/broken"; then
  printf 'Lien symbolique cassé\n'
fi
if ! readlink -e -- "$lab/broken"; then
  printf 'Cible finale introuvable\n'
fi

Attendez-vous aux messages « Lien symbolique cassé » et « Cible finale introuvable ». Pour inspecter d’autres liens, ls -l montre généralement la chaîne après une flèche, readlink la lit sans la résoudre et stat renseigne l’objet lien par défaut avec GNU Coreutils ; stat -L suit la cible lorsque c’est ce que vous voulez examiner. Un lien peut aussi être inutilisable faute de droits sur un répertoire intermédiaire : ne concluez pas à une suppression de la cible sur la seule base d’un échec d’accès.

Questions fréquentes

La commande ln crée-t-elle un lien symbolique par défaut ?

Non. Sans -s, GNU ln crée un lien physique vers un fichier admissible. Ajoutez -s pour stocker un chemin dans un lien symbolique.

Supprimer le nom d’origine détruit-il un fichier lié physiquement ?

Non, les données restent accessibles par les autres liens physiques du même inode tant qu’ils existent. Cela ne protège pas contre une modification du contenu partagé.

Peut-on créer un lien symbolique vers un dossier ou un chemin absent ?

Oui. Le chemin stocké peut viser un dossier ou être encore inexistant. Vérifiez ensuite la résolution et les droits avant de l’utiliser.

Comment éviter d’écraser le mauvais chemin avec ln -f ?

Vérifiez le type de la destination avec test -L, ls -ld et readlink, puis utilisez un chemin exact avec -T quand GNU ln est disponible. Gardez une sauvegarde et un plan de retour pour une destination de production.

La référence des commandes Linux par tâche situe ln parmi les outils de fichiers et de navigation.