Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
La commande ln
établit un lien symbolique ou un lien physique entre 2 fichiers.
Les modifications opérées sur/dans l'un sont visibles immédiatement depuis l'un ou l'autre des fichiers liés.
ln [option] <cible> <lien>
ln -s <fichier_cible> <nom_lien> ln -s <répertoire_cible> <nom_lien>
ln <fichier_cible> <fichier_lié>
ATTENTION : Un lien physique à la particularité de devoir se situer sur le même système de fichier que sa cible !
On distingue 2 sortes de lien : les liens durs et les liens symboliques.
Un lien symbolique est constitué d'un réel fichier de petite taille ; il contient le nom (chemin) du fichier auquel il correspond. Par conséquent, la suppression du fichier d'origine, c'est-à-dire la cible du lien, rendra le lien symbolique inutilisable puisqu'il ne correspondra plus à un fichier valide ; le lien sera alors brisé.
Un lien dur associe deux ou plusieurs fichiers à un même espace sur le disque. Ainsi un fichier peut disposer réellement de plusieurs noms (chemins). La suppression d'un fichier lié physiquement n'affectera pas les autres fichiers qui lui sont liés.
Nota :
Les systèmes de fichier msdos/fat/vfat et exfat ne prennent pas en charge ni les liens symboliques, ni les liens physiques.
(Démonstration dans le forum)
Afin de bien comprendre les principes que nous avons décrits ci-haut, nous allons illustrer tout cela à l'aide de quelques exemples simples.
Dans /home/votre_user/
, créez un répertoire nommé test_lien
avec mkdir et s'y positionner avec cd :
cd mkdir test_lien cd test_lien
Créer dans ce répertoire un fichiers vide, test1.txt
, avec touch, puis ajoutez-y le texte Bonjour toto avec la commande echo.
touch test1.txt echo Bonjour Jojo > test1.txt
On vérifie avec la commande cat que notre texte est bien écrit dans le fichier test1.txt :
cat test1.txt
Bonjour Jojo
Pour enregistrée un fichier sur un disque (dans une partition formatée avec un système de fichier), le disque et le système de fichier, découpent l'espace alloué en très petites unités nommée bloc.
Actuellement, sur un disque, la taille d'un bloc est le plus souvent de 4 K octets (4096 octets) ou de 512 octets (ancienne taille).
Un bloc est la plus petite unité qui peut être lue ou écrite.
Par exemple pour un système de fichier dont les blocs sont déterminés à 512 octets :
La liste des blocs qu'utilise un fichier est mémorisée par son inode2).
Quand un fichier est créé, un inode lui est attribué. Il identifie de façon unique ce fichier dans son système de fichier.
Le nom du fichier est alors rattaché (lié physiquement) à cet inode.
Notes : Une couche d’abstraction logiciel, tel que LVM (gestion de volume logique) ou LUKS (chiffrement des partitions ou de volumes logiques), peut modifier la taille des blocs logiques.
ext4
, utilisant des blocs de 4096 octets.Situation de départ :
ls -l
total 4 -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt
On crée le lien symbolique :
ln -s test1.txt lien1
Ce qui nous fait maintenant :
ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt
Attardons-nous un peu sur la ligne : lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt
lrwxrwxrwx
), la première lettre : l
, indique que ce fichier est un lien symbolique.9
, indique la taille en octet du fichier (elle ne doit pas être confondue avec la taille d'occupation sur le disque).-> test1.txt
indique le fichier que désigne le lien symbolique.Précisons aussi que :
Avant de poursuivre dans l'usage des liens symboliques,
Sont montrées, ci-dessous, quelques commandes qui ont attrait au liens symboliques.
Il a déjà été vu l'option -l
de la commande ls
.
Combinée avec l'option -L
, elle permet de retourner les informations de la cible plutôt que celles du lien :
ls -Ll
total 4 -rw-r--r-- 1 martin martin 13 déc 14 22:02 lien1 -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt
L'option -F
de la commande ls
, ajoute un @
(arobase) à la fin de chaque lien symbolique listé, permettant ainsi de les distinguer.
ls -F
lien1@ test1.txt
La commande stat
3) qui permet de retourner des détails sur des fichiers.
(En permettant de choisir les informations retournées, la commande stat
est plus souple que la commande ls
.)
Avec l'option -c
et le format %N
, retourne le nom du fichier et s'il s’agit de lien symbolique, celui de sa cible :
Note : Dans un contexte de chemin, le caractère *
est un caractère générique qui signifie n'importe quelle chaîne de caractère.
stat -c%N *
lien1 -> test1.txt test1.txt
La commande readlink
4) retourne la cible mémorisée par un lien symbolique :
readlink lien1
test1.txt
La commande file
5) retourne le type de fichier étudié, s'il s'agit d'un lien symbolique, sa cible est aussi indiquée :
file lien1
lien1: symbolic link to test1.txt
echo Comment vas-tu ? >> lien1 cat lien1
Bonjour toto Comment vas-tu ?
cat test1.txt
Bonjour toto Comment vas-tu ?
ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Nous pouvons voir que seul le fichier cible 'test1.txt
s'est trouvé modifié, passant de 13 à 30 octets d'occupation !
Modifier directement le fichier cible donnera le même résultat :
À l'aide de la commande ls -li
, nous pouvons voir la taille des fichiers et comparer leurs inodes (l'option -i
demande l'affichage de l'identifiant d'un inode) :
ls -li
total 4 8667148 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt 8667139 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Le premier champ indique que chacun des fichiers ont un inode différent.
Cela implique qu'il y a bien deux occupations différentes sur le disque (2 fichiers différents), avec une occupation qui restera toujours fixe et minimale pour le fichier du lien symbolique.
L'option -s
de la commande ls
indique la taille occupée par le(s) bloc(s) utilisé(s) par un fichier.
L'option -h
permet de présenter les tailles avec l'unité la plus appropriée (Ko, Mo, Go, etc).
ls -lsh
total 4,0K 0 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt 4,0K -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Le fichier test1.txt
de 30 octets (28 caractères imprimables + 2 caractères de saut de ligne) occupe un bloc entier. Il a donc, ici, une taille de 4 K octets.
Le fichier du lien symbolique lien1
de 9 octets (correspondant au nombre de caractère du nom du fichier cible) n'occupe aucun bloc, il est donc de taille nulle.
59a
, cible un fichier (inexistant) nommé par 59 caractères (59 a).60a
, cible un fichier (inexistant) nommé par 60 caractères (60 a).(for i in {1..59};do n=a$n;done; ln -s $n 59a; ln -s a$n 60a); ls -lsh 59a 60a
0 lrwxrwxrwx 1 martin martin 59 déc 14 22:15 59a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 4,0K lrwxrwxrwx 1 martin martin 60 déc 14 22:15 60a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Tant que le chemin (le nom) de la cible mémorisé par un lien symbolique, ne dépasse pas un certain nombre de caractère (ici 60), il est stocker par l'inode du lien symbolique. Ainsi aucun fichier (bloc) n'est ouvert pour connaître la cible. Seul l'inode est lu. Au delà, un bloc est utiliser. Alors le système doit ouvrir (lire) ce bloc pour accéder à la cible.
Voir : (fr) Lien symbolique > Stockage (wikipedia.org)
La commande rm
permet de supprimer des fichiers.
rm -v 59a 60a
'59a' supprimé '60a' supprimé
L'effacement du fichier du lien symbolique lien1
ne détruit ni le contenu, ni l'apparence du fichier cible test1.txt
:
rm lien1 ls -l
total 4 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Recréons le même lien symbolique lien1
:
ln -s test1.txt lien1 ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:13 lien1 -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Modifions le nom du fichier du lien symbolique lien1
à l'aide de la commande mv :
mv lien1 lien2 ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:13 lien2 -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Tout reste fonctionnel et en place.
lien2
en lien1
.
mv lien2 lien1
Modifions le nom du fichier cible test1.txt
:
mv test1.txt test2.txt ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:13 lien1 -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test2.txt
Patatras ! Nous voyons alors que le fichier cible lien1
se met en carafe (il alors est écrit en rouge dans le terminal bash).
Lorsque la cible d'un lien symbolique est manquante, le lien est dit brisé ou cassé. La commande file
le montre :
file lien1
lien1: broken symbolic link to test1.txt
Puisque le lien est cassé (sa cible n'existe plus), la commande cat
retourne une erreur :
cat lien1
cat: lien1: Aucun fichier ou dossier de ce type
Ainsi que la commande ls -L
ls -L lien1
ls: impossible d'accéder à 'lien1': Aucun fichier ou dossier de ce type
Pour rétablir les choses, ici, il suffit :
test2.txt
en test1.txt
,lien1
avec la commande ln
,test2.txt
f
(pour forcer l'écrasement du fichier de destination) :ln -sf test2.txt lien1
Et tout redevient effectif.
Pour la suite du tuto, choisir de remettre le fichier cible en test1.txt
mv test2.txt test1.txt
Depuis le début de cette illustration, nous voyons que les droits restent immuablement complets pour le fichier du lien symbolique lien1
.
rwx rwx rwx
Essayons de les modifier.
Modifions la propriété du fichier du lien symbolique lien1
pour que seul le propriétaire puisse y accéder en lecture et écriture.
Situation de départ :
ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
Les droits d'un fichier sont modifiés avec la commande chmod :
chmod 600 lien1
On obtient alors :
ls -l
total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt -rw------- 1 martin martin 30 déc 14 22:08 test1.txt
Nous voyons que le fichier du lien symbolique lien1
n'est pas affecté par cette modifications des droits :
lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt
Et que le fichier cible test1.txt
s'en trouve directement rectifié par cette commande exécuter sur le lien symbolique lien1
:
-rw------- 1 martin martin 30 déc 14 22:08 test1.txt
La simple copie de lien symbolique produit un nouveau fichier pour chaque lien, identique à la cible.
Tout d'abord, créons le répertoire rep1
.
Puis copions les deux fichiers :
mkdir rep1 cp -v lien1 test1.txt rep1
'lien1' -> 'rep1/lien1' 'test1.txt' -> 'rep1/test1.txt'
Maintenant listons (avec les détails) le contenu du répertoire rep1
ls -l rep1/*
-rw-r--r-- 1 martin martin 30 déc 14 22:20 rep1/lien1 -rw-r--r-- 1 martin martin 30 déc 14 22:20 rep1/test1.txt
C'est bien la cible (test1.txt
) du lien symbolique (lien1
) qui à été copié dans le répertoire rep1
, sous le nom du lien (lien1
).
file rep1/*
rep1/lien1: ASCII text rep1/test1.txt: ASCII text
L'option -P
ou -d
de la commande cp
permet de préserver les liens symboliques :
rm rep1/* cp -vP lien1 test1.txt rep1
'lien1' -> 'rep1/lien1' 'test1.txt' -> 'rep1/test1.txt'
Affichage des détails du contenu du répertoire rep1
:
ls -l rep1/*
lrwxrwxrwx 1 martin martin 9 déc 14 22:22 rep1/lien1 -> test1.txt -rw------- 1 martin martin 30 déc 14 22:22 rep1/test1.txt
Ce coup ci, le lien symbolique à été copier exactement comme il est, ciblant le fichier test1.txt
situé dans le même répertoire que lui (dans rep1
).
file rep1/*
rep1/lien1: symbolic link to test1.txt rep1/test1.txt: ASCII text
Ici, tout va bien puisque le lien à été copié en même temps que sa cible.
Si seul le lien avait été copié, un lien brisé (sans cible) aurait été obtenu :
rm rep1/* cp -P lien1 rep1/lien2 ls -l rep1/*
lrwxrwxrwx 1 martin martin 9 déc 14 22:24 rep1/lien2 -> test1.txt
Le lien à été copié dans le répertoire rep1
, mais il est brisé (puisqu'il n'a pas de cible) :
file rep1/*
rep1/lien2: broken symbolic link to test1.txt
Cela provient du fait que le lien originel a été créé en désignant sa cible par un chemin relatif6).
Il en serait autrement si le lien avait été construit en fournissant un chemin absolu7).
Alors il désignerait toujours la même cible, même s'il était copié n'importe où dans l'arborescence.
note : Le caractère ~
(tilde), placé au début d'un chemin, est remplacé durant l'interprétation de bash, par le chemin absolu du répertoire personnel de l’utilisateur (ici : /homme/martin
).
ln -s ~/test_lien/test1.txt lien3 ls -l
total 8 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1 -> test1.txt lrwxrwxrwx 1 martin martin 32 déc 14 22:30 lien3 -> /home/martin/test_lien/test1.txt drwxr-xr-x 2 martin martin 4096 déc 14 22:20 rep1 -rw------- 1 martin martin 30 déc 14 22:08 test1.txt
Les deux liens symboliques lien1
et lien3
désignent le même fichier cible : test1.txt
.
/home/martin/test_lien
)./
).
Copie du nouveau lien lien3
dans le répertoire rep1
:
cp -P lien3 rep1/lien4 file rep1/*
rep1/lien2: broken symbolic link to test1.txt rep1/lien4: symbolic link to /home/martin/test_lien/test1.txt
Contrairement à la copie du lien lien1
(vers rep1/lien2
), la copie du lien lien3
(vers rep1/lien4
) à conservé sa cible.
cat rep1/lien4
Bonjour toto Comment vas-tu ?
Un lien symbolique peut cibler un répertoire.
ln -s rep1 lien_rep1 ls -l lien_rep1
lrwxrwxrwx 1 martin martin 4 déc 14 22:40 lien_rep1 -> rep1
Le nouveau lien lien_rep1
, à pour cible le répertoire rep1
.
Il peut-être utilisé pour accéder à sa cible, pour y réaliser toutes sortes d'opérations.
Par exemple, en lister le contenu :
ls -l lien_rep1/*
lrwxrwxrwx 1 martin martin 9 déc 14 22:24 lien_rep1/lien2 -> test1.txt lrwxrwxrwx 1 martin martin 32 déc 14 22:32 lien_rep1/lien4 -> /home/martin/test_lien/test1.txt
En utilisant un chemin absolu pour désigner la cible, un lien peut être placé n'importe où :
ln -s ~/test_lien /tmp ls -l /tmp/test_lien
lrwxrwxrwx 1 martin martin 21 déc 14 22:42 /tmp/test_lien -> /home/martin/test_lien
Un lien symbolique qui cible un répertoire, agit comme un répertoire.
Il est possible de s'y déplacer :
Note : La commande pwd retourne le chemin du répertoire courant (celui où l'on se trouve).
pwd
/home/martin/test_lien
cd /tmp/test_lien pwd
/tmp/test_lien
C'est comme si l'on se trouvait dans le répertoire cible :
ls -F
lien1@ lien3@ lien_rep1@ rep1 test1.txt
touch rep1/fichier.txt ls -F ~/test_lien/rep1
fichier.txt lien2@ lien4@
Un lien physique est la création d'un fichier à l'identique de celui qu'il pointe.
Mais outre d'évoluer à l'identique, comme avec un lien symbolique, les deux fichiers se nourrissent mutuellement et concrètement de toutes les modifications apportées à l'un ou à l'autre.
Commençons par supprimer les fichiers liés symboliquement et créer un fichier de départ vide, test2, :
rm *1.txt touch test2.txt
Au départ, nous avons donc la situation suivante :
ls -l
total 0 -rw-r--r-- 1 martin martin 0 déc 15 00:02 test2.txt
Pour créer un lien physique, on utilise la commande ln
sans l'option -s
.
ln test2.txt lien2.txt ls -lv
total 0 -rw-r--r-- 2 martin martin 0 déc 15 00:02 lien2.txt -rw-r--r-- 2 martin martin 0 déc 15 00:02 test2.txt
Ah ! Plus de lettre “l
” ni de “flèches” pour indiquer le lien physique.
Nous pouvons toutefois distinguer un changement dans le listage des droits des fichiers liés physiquement :
Le chiffre 1
devient 2
dans la ligne du fichier cible test2.txt :
Pareillement dans la ligne du lien2.txt
: -rw-r–r– 2 martin martin 0 déc 15 00:02 lien2.txt
ls -l
, indique ne nombre de noms (chemins) que dispose un fichier.1
: Quand un fichier n'est pas lié physiquement.2
: Indique que ce fichier est lié à un autre fichier. Il dispose alors de 2 noms.3
: Indique que ce fichier est lié à deux autres fichiers. Il dispose alors de 3 noms.Une autre différence est le partage des droits qui sont là tout à fait identiques entre les fichiers liés physiquement.
Ajoutons du contenu dans l'un puis un second ajout dans l'autre des fichiers liés physiquement en vérifiant les contenus à chaque fois :
echo Très bien titi ! > lien2.txt ls -l
total 8 -rw-r--r-- 2 martin martin 18 déc 15 13:49 lien2.txt -rw-r--r-- 2 martin martin 18 déc 15 13:49 test2.txt
cat test2.txt
Très bien titi !
echo Et toi Jojo ? >> test2.txt cat lien2.txt
Très bien titi ! Et toi Jojo ?
ls -l
total 8 -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt -rw-r--r-- 2 martin martin 32 déc 15 13:52 test2.txt
Toutes les modifications, ajoutées ou retranchées dans chacun des fichiers agira de même dans l'autre.
À l'aide de la commande ls -li
, nous pouvons voir l'occupation disque générée par un lien hardlink en constatant les chiffres indiquant les index respectifs des inodes de chacun des fichiers liés :
ls -li
total 8 8667149 -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt 8667149 -rw-r--r-- 2 martin martin 32 déc 15 13:52 test2.txt
Ah ! Le même index d'inode pour les deux fichiers !
Cela implique qu'il n'y a pas deux occupations différentes sur le disque mais une seule occupation vers laquelle pointe les deux fichiers liés en même temps !
On va pas s'gêner avec pour les gonfler de données car cela ne doublera pas l'occupation physique du disque !
Suppression du fichier cible test2.txt
:
rm test2.txt ls -l
total 4 -rw-r--r-- 1 martin martin 32 déc 15 13:52 lien2.txt
Comme dit le captnfab dans sa relecture :
Il est à remarquer que le chiffre 2
est passé à 1
car il n'y a plus de second fichier lié.
Pour supprimer définitivement les deux fichiers et leurs contenus, nous devons les effacer tous deux.
rm *2.txt ls -l
total 0
Voilà pour la commande ln
dans tous ses états !
Merci au captnfab pour sa bienveillante et rigolote attention !
Les liens sont utiles si vous souhaitez qu'un fichier apparaisse dans plusieurs répertoires, ou sous un nom différent.
Si le fichier a une assez grande taille vous pouvez envisager, au lieu de copier dans un répertoire donné, de créer un lien réduisant ainsi l'utilisation d'espace disque.
Autre point très intéressant, créer des liens, au lieu de copier les fichiers, assure que toute modification dans un fichier se retrouvera bien dans les « copies » dispersées un peu partout.
stat
au lieu de ls
. Car stat
permet de spécifier les informations retournées. Contrairement à ls
, dont les champs retournés varient selon le type de fichier étudié et peuvent différer d'un système à l'autre. manuel (fr) stat (1) : Afficher l'état d'un fichier ou d'un système de fichiers (manpage.org) - man stat
man readlink
man file
/
).