logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
doc:systeme:ln [11/08/2024 15:35]
agp91 [Les liens symboliques (symlink) > Modifications des droits] Corrections
doc:systeme:ln [14/08/2024 17:38] (Version actuelle)
agp91 [Les liens physiques (hardlink) ] : Corrections de code
Ligne 11: Ligne 11:
   * Suivi : {{tag>​à-compléter}}{{tag>​à-tester}}   * Suivi : {{tag>​à-compléter}}{{tag>​à-tester}}
     * Création par [[user>​smolski]] le 21/06/2010     * Création par [[user>​smolski]] le 21/06/2010
-    * Testé ​par [[user>​agp91]] le 04/07/2024+    * Modifié ​par [[user>​agp91]] le 11/08/2024
   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​pid=113446|C'​est ici]]((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​pid=113446|C'​est ici]]((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
  
Ligne 157: Ligne 157:
 ls -Ll ls -Ll
 </​code><​code>​ </​code><​code>​
 +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 lien1
 -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt
Ligne 291: Ligne 292:
 </​code>​ </​code>​
 </​note>​ </​note>​
- 
- 
-==== Suppression d'un lien symbolique ==== 
- 
-L'​effacement du fichier du lien symbolique ''​lien1''​ ne détruit ni le contenu, ni l'​apparence du fichier cible ''​test1.txt''​ : 
- 
-<code user> 
-rm lien1 
-ls -l 
-</​code><​code>​ 
-total 4 
--rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt 
-</​code>​ 
- 
-Recréons le même lien symbolique ''​lien1''​ : 
-<code user> 
-ln -s test1.txt lien1 
-ls -l 
-</​code><​code>​ 
-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 
-</​code>​ 
  
 ==== Modification du nom d'un lien symbolique ==== ==== Modification du nom d'un lien symbolique ====
Ligne 333: Ligne 311:
 <code user>mv lien2 lien1</​code>​ <code user>mv lien2 lien1</​code>​
  
-==== Modification du nom d'un fichier ​cible ====+==== Modification du nom de la cible ====
  
 Modifions le nom du fichier cible ''​test1.txt''​ : Modifions le nom du fichier cible ''​test1.txt''​ :
Ligne 348: Ligne 326:
 //Patatras !// Nous voyons alors que le fichier cible ''​lien1''​ se met en carafe (il alors est écrit en rouge dans le terminal //bash//). //Patatras !// Nous voyons alors que le fichier cible ''​lien1''​ se met en carafe (il alors est écrit en rouge dans le terminal //bash//).
  
-Il suffit :+Lorsque la cible d'un lien symbolique est manquante, le lien est dit brisé ou cassé. La commande ''​file''​ le montre : 
 + 
 +<code user> 
 +file lien1 
 +</​code><​code>​ 
 +lien1: broken symbolic link to test1.txt 
 +</​code>​ 
 + 
 +Puisque le lien est cassé (sa cible n'​existe plus), la commande ''​cat''​ retourne une erreur : 
 + 
 +<code user> 
 +cat lien1 
 +</​code><​code>​ 
 +cat: lien1: Aucun fichier ou dossier de ce type 
 +</​code>​ 
 + 
 +Ainsi que la commande ''​ls -L''​ 
 + 
 +<code user> 
 +ls -L lien1 
 +</​code><​code>​ 
 +ls: impossible d'​accéder à '​lien1':​ Aucun fichier ou dossier de ce type 
 +</​code>​ 
 + 
 +Pour rétablir les choses, ici, il suffit :
   * De renommer le fichier cible ''​test2.txt''​ en ''​test1.txt'',​   * De renommer le fichier cible ''​test2.txt''​ en ''​test1.txt'',​
   * Ou bien de recréer le lien symbolique ''​lien1''​ avec la commande ''​ln'',​\\ En désignant le fichier cible ''​test2.txt''​\\ Et en utilisant l'​option ''​f''​ (pour forcer l'​écrasement du fichier de destination) :\\ ''​ln -sf test2.txt lien1''​\\ :!: Attention de ne pas intervertir les deux noms, car sinon ce sera le fichier cible qui sera écrasé.   * Ou bien de recréer le lien symbolique ''​lien1''​ avec la commande ''​ln'',​\\ En désignant le fichier cible ''​test2.txt''​\\ Et en utilisant l'​option ''​f''​ (pour forcer l'​écrasement du fichier de destination) :\\ ''​ln -sf test2.txt lien1''​\\ :!: Attention de ne pas intervertir les deux noms, car sinon ce sera le fichier cible qui sera écrasé.
Ligne 387: Ligne 389:
 </​code><​code>​ </​code><​code>​
 total 4 total 4
- 
 lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt 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 -rw------- 1 martin martin 30 déc 14 22:08 test1.txt
Ligne 399: Ligne 400:
 <​code>​-rw------- 1 martin martin 30 déc 14 22:08 test1.txt</​code>​ <​code>​-rw------- 1 martin martin 30 déc 14 22:08 test1.txt</​code>​
  
 +==== Copies de lien symbolique ====
  
-===== Les liens physiques (hardlink) : =====+La simple copie de lien symbolique produit un nouveau fichier pour chaque lien, identique à la cible.
  
-Un lien physique est la création ​d'un fichier à l'identique de celui qu'il pointe.+Tout d'abord, créons le répertoire ''​rep1''​.\\ 
 +Puis copions les deux fichiers :
  
-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.+<code user> 
 +mkdir rep1 
 +cp -v lien1 test1.txt rep1 
 +</​code><​code>​ 
 +'lien1' ​-> 'rep1/lien1' 
 +'test1.txt' -> '​rep1/​test1.txt'​ 
 +</​code>​
  
 +Maintenant listons (avec les détails) le contenu du répertoire ''​rep1''​
  
-<note important>**ATTENTION ​:** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible !</note>+<code user> 
 +ls -l rep1/* 
 +</​code><​code>​ 
 +-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 
 +</code>
  
-==== Créer ​un lien physique ​====+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''​). 
 + 
 +<code user> 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien1: ASCII text 
 +rep1/​test1.txt:​ ASCII text 
 +</​code>​ 
 + 
 +---- 
 + 
 +L'​option ''​-P''​ ou ''​-d''​ de la commande ''​cp''​ permet de préserver les liens symboliques : 
 + 
 +<code user> 
 +rm rep1/* 
 +cp -vP lien1 test1.txt rep1 
 +</​code><​code>​ 
 +'​lien1'​ -> '​rep1/​lien1'​ 
 +'​test1.txt'​ -> '​rep1/​test1.txt'​ 
 +</​code>​ 
 + 
 +Affichage des détails du contenu du répertoire ''​rep1''​ : 
 + 
 +<code user> 
 +ls -l rep1/* 
 +</​code><​code>​ 
 +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 
 +</​code>​ 
 + 
 +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''​). 
 + 
 +<code user> 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien1: symbolic link to test1.txt 
 +rep1/​test1.txt:​ ASCII text 
 +</​code>​ 
 + 
 +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 : 
 + 
 +<code user> 
 +rm rep1/* 
 +cp -P lien1 rep1/​lien2 
 +ls -l rep1/* 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:24 rep1/lien2 -> test1.txt 
 +</​code>​ 
 + 
 +Le lien à été copié dans le répertoire ''​rep1'',​ mais il est brisé (puisqu'​il n'a pas de cible) : 
 + 
 +<code user> 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien2: broken symbolic link to test1.txt 
 +</​code>​ 
 + 
 +Cela provient du fait que le lien originel a été créé en désignant sa cible par un chemin relatif((Un **chemin relatif** désigne un emplacement depuis un répertoire.)). 
 + 
 +---- 
 + 
 +Il en serait autrement si le lien avait été construit en fournissant un chemin absolu((Un **chemin absolu** désigne un emplacement depuis le répertoire racine (''/''​).)).\\ 
 +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''​). 
 + 
 +<code user> 
 +ln -s ~/​test_lien/​test1.txt lien3 
 +ls -l 
 +</​code><​code>​ 
 +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 
 +</​code>​ 
 + 
 +Les deux liens symboliques ''​lien1''​ et ''​lien3''​ désignent le même fichier cible : ''​test1.txt''​. 
 + 
 +  * Le premier désigne sa cible avec un chemin relatif (au répertoire ''/​home/​martin/​test_lien''​).\\ 
 +  * Le second désigne sa cible avec un chemin absolu, depuis la racine du système (''/''​). 
 + 
 +Copie du nouveau lien ''​lien3''​ dans le répertoire ''​rep1''​ : 
 + 
 +<code user> 
 +cp -P lien3 rep1/​lien4 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien2: broken symbolic link to test1.txt 
 +rep1/lien4: symbolic link to /​home/​martin/​test_lien/​test1.txt 
 +</​code>​ 
 + 
 +Contrairement à la copie du lien ''​lien1''​ (vers ''​rep1/​lien2''​),​ la copie du lien ''​lien3''​ (vers ''​rep1/​lien4''​) à conservé sa cible. 
 + 
 +<code user> 
 +cat rep1/​lien4 
 +</​code><​code>​ 
 +Bonjour toto 
 +Comment vas-tu ? 
 +</​code>​ 
 + 
 +==== Répertoire et lien symbolique ==== 
 + 
 +Un lien symbolique peut cibler ​un répertoire. 
 + 
 +<code user> 
 +ln -s rep1 lien_rep1 
 +ls -l lien_rep1 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin 4 déc 14 22:40 lien_rep1 -> rep1 
 +</​code>​ 
 + 
 +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 : 
 + 
 +<code user> 
 +ls -l lien_rep1/​* 
 +</​code><​code>​ 
 +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 
 +</​code>​ 
 + 
 +---- 
 + 
 +En utilisant un chemin absolu pour désigner la cible, un lien peut être placé n'​importe où : 
 + 
 +<code user> 
 +ln -s ~/test_lien /tmp 
 +ls -l /​tmp/​test_lien 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin 21 déc 14 22:42 /​tmp/​test_lien -> /​home/​martin/​test_lien 
 +</​code>​ 
 + 
 +Un lien symbolique qui cible un répertoire,​ agit comme un répertoire.\\ 
 +Il est possible de s'y déplacer : 
 + 
 +**__Note__ :** La commande **[[doc:​systeme:​pwd|pwd]]** retourne le chemin du répertoire courant (celui où l'on se trouve). 
 + 
 +<code user> 
 +pwd 
 +</​code><​code>​ 
 +/​home/​martin/​test_lien 
 +</​code>​ 
 + 
 +<code user> 
 +cd /​tmp/​test_lien 
 +pwd 
 +</​code><​code>​ 
 +/​tmp/​test_lien 
 +</​code>​ 
 + 
 +C'est comme si l'on se trouvait dans le répertoire cible : 
 + 
 +<code user> 
 +ls -F 
 +</​code><​code>​ 
 +lien1@ ​ lien3@ ​ lien_rep1@ ​ rep1  test1.txt 
 +</​code>​ 
 + 
 +<code user> 
 +touch rep1/​fichier.txt 
 +ls -F ~/​test_lien/​rep1 
 +</​code><​code>​ 
 +fichier.txt ​ lien2@ ​ lien4@ 
 +</​code>​ 
 + 
 +==== Suppression de lien symbolique ==== 
 + 
 +Supprimer liens symboliques n'​altère en rien un fichier cible : 
 + 
 +<code user> 
 +rm -v lien1 lien3 rep1/​lien* 
 +</​code><​code>​ 
 +'​lien1'​ supprimé 
 +'​lien3'​ supprimé 
 +'​rep1/​lien2'​ supprimé 
 +'​rep1/​lien4'​ supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +ls -l test1.txt 
 +</​code><​code>​ 
 +total 4 
 +-rw------- 1 martin martin 30 déc 14 22:08 test1.txt 
 +</​code>​ 
 + 
 +---- 
 + 
 +Ni même un répertoire,​ lorsque l'on supprime le(s) lien(s) symbolique(e) le ciblant : 
 + 
 +<code user> 
 +cd ~/​test_lien 
 +rm -v /​tmp/​test_lien lien_rep1 
 +</​code><​code>​ 
 +'/​tmp/​test_lien'​ supprimé 
 +'​lien_rep1'​ supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +ls -R ~/​test_lien 
 +</​code><​code>​ 
 +/​home/​martin/​test_lien:​ 
 +rep1  test1.txt 
 + 
 +./rep1: 
 +fichier.txt 
 +</​code>​ 
 + 
 +**__Note__ :** Pour supprimer un répertoire avec la commande **[[doc:​systeme:​rmdir|rmdir]]**,​ le répertoire doit être vide. 
 + 
 +<code user> 
 +rm rep1/​fichier.txt 
 +rmdir rep1 
 +rm test1.txt 
 +</​code>​ 
 + 
 +===== Les liens physiques (hardlink) : ===== 
 + 
 +Un lien physique rattache un nom de fichier à un inode. 
 + 
 +Un inode (un fichier) peut être lié à plusieurs noms dans le même système de fichier.\\ 
 +Ainsi, plusieurs noms (chemins) peuvent permettre d'​accéder au même fichier (au même inode) 
 + 
 +<note important>​**ATTENTION :** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible !\\ 
 +\\ 
 +L'​identifiant d'un inode est unique, uniquement dans le système de fichier au quel il appartient.\\ 
 +Puisque l'​identifiant d'un inode n'est unique que dans son système de fichier (il peut exister dans un autre système de fichier), un nom ne peut donc être lié à l'​inode d'un autre système de fichier.</​note>​
  
-Commençons par supprimer les fichiers liés symboliquement et créer un fichier de départ vide, test2:+Commençons par créer un fichier de départ vide, ''​test2.txt'' ​:
  
 <code user> <code user>
-rm *1.txt 
 touch test2.txt touch test2.txt
 </​code>​ </​code>​
Ligne 425: Ligne 670:
 -rw-r--r-- 1 martin martin 0 déc 15 00:02 test2.txt -rw-r--r-- 1 martin martin 0 déc 15 00:02 test2.txt
 </​code>​ </​code>​
 +
 +==== Créer un lien physique ====
  
 Pour créer un lien physique, on utilise la commande ''​ln''​ sans l'​option ''​-s''​. Pour créer un lien physique, on utilise la commande ''​ln''​ sans l'​option ''​-s''​.
 <code user> <code user>
 ln test2.txt lien2.txt ln test2.txt lien2.txt
-ls -lv+ls -l
 </​code><​code>​ </​code><​code>​
 total 0 total 0
Ligne 439: Ligne 686:
 Nous pouvons toutefois distinguer un changement dans le listage des droits des fichiers liés physiquement : 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 :+Le chiffre ''​1'' ​du second champs, ​devient ''​2''​ dans la ligne du fichier ​''​test2.txt'' ​:\\ 
 +''<​nowiki>​-rw-r--r--</​nowiki>​ **2** <​nowiki>​martin martin 0 déc 15 00:02 lien2.txt</​nowiki>''​
  
-Pareillement dans la ligne du ''​lien2.txt''​ : ''​-rw-r--r-- **2** martin martin 0 déc 15 00:02 lien2.txt''​+Pareillement dans la ligne du ''​lien2.txt''​ :\\ 
 +''​<​nowiki>​-rw-r--r--</​nowiki> ​**2** <​nowiki>​martin martin 0 déc 15 00:02 lien2.txt</​nowiki>​''​
  
-<note tip>Le second champ retourné par le commande ''​ls -l'',​ indique ne nombre de noms (chemins) ​que dispose ​un fichier.\\+<note tip>Le second champ retourné par le commande ''​ls -l'',​ indique ne nombre de fois que l'​inode d'un fichier ​est lié à un nom (le nombre de fois où un fichier est lié physiquement).\\
 \\ \\
-  * ''​1''​ : Quand un fichier n'​est ​pas lié physiquement+  * ''​1''​ : Quand un fichier ne dispose que de son nom (l'​inode de ce fichier n'est lié qu'à un seul nom)
-  * ''​2''​ : Indique que ce fichier est lié à un autre fichier. Il dispose alors de 2 noms. +  * ''​2''​ : Indique que l'​inode de ce fichier est lié à 2 noms. 
-  * ''​3''​ : Indique que ce fichier est lié à deux autres fichiers. Il dispose alors de 3 noms.+  * ''​3''​ : Indique que l'​inode de ce fichier est lié à 3 noms.
   * Etc.   * Etc.
 </​note>​ </​note>​
Ligne 489: Ligne 738:
 Toutes les modifications,​ __ajoutées ou retranchées__ dans chacun des fichiers agira de même dans l'​autre. Toutes les modifications,​ __ajoutées ou retranchées__ dans chacun des fichiers agira de même dans l'​autre.
  
-==== Occupation ​concrète ​sur le disque ====+==== Occupation sur le disque ====
  
-À 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 :+À l'aide de la commande ''​ls -li'',​ nous pouvons voir la taille ​des fichiers et comparer leurs inodes : 
  
 <code user> <code user>
Ligne 501: Ligne 750:
 </​code>​ </​code>​
  
-Ah ! Le même index d'​inode pour les deux fichiers !+Ah ! Le même 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 ! :-)+Cela implique qu'​__il n'y a pas deux occupations différentes__ sur le disque.\\ 
 +Ces deux fichiers sont deux noms différents ​liés physiquement au même inode.\\ 
 +Ayant le même inode ils utilisent la même liste de bloc mémorisée par l'​inode.
  
 //On va pas s'​gêner avec pour les gonfler de données car cela ne doublera pas l'​occupation physique du disque !// :-D //On va pas s'​gêner avec pour les gonfler de données car cela ne doublera pas l'​occupation physique du disque !// :-D
 +
 +Pourtant ce n'est pas ce qu'​indique le total de la commande ''​ls -l''​.\\
 +Ce total retourne que les deux fichiers (qui ne sont qu'un) occupent sur le disque 8 K octets.\\
 +La commande ''​ls -lh''​ le montre :
 +
 +<code user>
 +ls -lh
 +</​code><​code>​
 +total 8,0 K
 +-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
 +</​code>​
 +
 +Ces fichiers ont  une taille de 32 octets chacun (c'est indiqué dans le 5em champ),\\
 +Selon ''​ls'',​ ils occuperaient chacun un bloc (de 4 K octets), qu'​elle additionne.\\
 +C'est ce que montre ''​ls -lsh''​ :
 +
 +<code user>
 +ls -lsh
 +</​code><​code>​
 +total 8,0 K
 +4,0K -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt
 +4,0K -rw-r--r-- 2 martin martin 32 déc 15 13:52 test2.txt
 +</​code>​
 +
 +Il en va de même avec la commande ''​stat''​ (d'​écrite plus haut à la section [[#​creer-un-lien-symbolique|Créer un lien symbolique]]),​ qui avec l'​option ''​-c''​ permet de définir les informations retournées.\\
 +Voici d'​autres formats supportés :
 +
 +  * ''​%b''​ indique le nombre de bloc utilisé par un fichier.
 +  * ''​%B''​ retourne la taille d'un bloc.
 +  * Et ''​%n''​ retourne le nom du fichier.
 +
 +<code user>
 +stat -c "%b (x%B) %n" *
 +</​code><​code>​
 +8 (x512) lien2.txt
 +8 (x512) test2.txt
 +</​code>​
 +
 +La commande ''​stat''​ utilise par défaut des blocs de 512 octets.\\
 +8x512 = 4096 (soit 4K octets), cela correspond aux tailles retournées par la commande ''​ls''​.
 +
 +Mais cela est évidement erroné,\\
 +Puisque ''​lien2.txt''​ et ''​test2.txt'',​ sont des noms (chemins) différents,​ qui mènent au même fichier (inode) stocké dans le système de fichier (sur le disque).
 +
 +<note tip>
 +Pour connaître la taille réelle occupée par des fichiers, la commande ''​du''​ doit être utilisée.
 +</​note>​
 +
 +<code user>
 +du -h *
 +</​code><​code>​
 +4,​0K lien2.txt
 +</​code>​
 +
 +Puisque ''​lien2.txt''​ et ''​test2.txt''​ sont le même fichier, ''​du''​ n'en retourne qu'​un.\\
 +La taille total occupée est donc de 4 K octets, soit un bloc.
 +
 +Il est remarquable qu'ici ne soit pas retourné le fichier original.\\
 +''​Du''​ a simplement retourné le premier lien physique rencontré.\\
 +Cela met en évidence qu'il n'y a pas de différence entre le fichier original et le(s) fichier(s) qui lui est (sont) lié(s).
 +
 +==== Copies de fichier lié physiquement ====
 +
 +8 K octets sera la taille totale obtenu si l'on copie ces deux fichiers liés :
 +
 +<code user>
 +mkdir rep1
 +cp -v *2.txt rep1
 +</​code><​code>​
 +'​lien2.txt'​ -> '​rep1/​lien2.txt'​
 +'​test2.txt'​ -> '​rep1/​test2.txt'​
 +</​code>​
 +
 +**__Note__ :** L'​option ''​-c''​ de la commande ''​du''​ demande le total des fichiers listés.
 +
 +<​code>​
 +du -ch rep1/*
 +</​code><​code>​
 +4,​0K rep1/​lien2.txt
 +4,​0K rep1/​test2.txt
 +8,0K total
 +</​code>​
 +
 +Ce coup ci, la commande ''​du''​ retourne deux fichiers de 4 K octets (1 bloc) chacun, soit un total de 8 K octets.
 +
 +Le format ''​%i''​ de la commande ''​stat''​ retourne l'​inode indexé d'un fichier.\\
 +Et ''​%h''​ le nombre de lien physique que dispose un fichier.
 +
 +<code user>
 +stat -c "%i %h %n" *.txt rep1/*.txt
 +</​code><​code>​
 +8667149 2 lien2.txt
 +8667149 2 test2.txt
 +8667652 1 rep1/​lien2.txt
 +8667653 1 rep1/​test2.txt
 +</​code>​
 +
 +Les inodes sont différents,​ il s’agit donc de deux fichiers différents.\\
 +La commande ''​cp''​ à copier le fichier ''​lien2.txt''​ puis le fichier ''​test2.txt'',​ sans maintenir les liens physiques.
 +
 +----
 +
 +<note tip>
 +L'​option ''​-l''​ de la commande ''​cp''​ permet de lier physiquement des fichiers au lieu de les copier.\\
 +(A condition qu'ils soient <​del>​copiés</​del>​ liés dans le même système de fichier.)
 +</​note>​
 +
 +<code user>
 +rm -v rep1/*
 +</​code><​code>​
 +'​rep1/​lien2.txt'​ supprimé
 +'​rep1/​test2.txt'​ supprimé
 +</​code>​
 +
 +<code user>
 +cp -vl *2.txt rep1
 +</​code><​code>​
 +'​lien2.txt'​ -> '​rep1/​lien2.txt'​
 +'​test2.txt'​ -> '​rep1/​test2.txt'​
 +</​code>​
 +
 +<code user>
 +stat -c "%i %h %n" * rep1/*
 +</​code><​code>​
 +8667149 4 lien2.txt
 +8695636 2 rep1
 +8667149 4 test2.txt
 +8667149 4 rep1/​lien2.txt
 +8667149 4 rep1/​test2.txt
 +</​code>​
 +
 +Les deux nouveaux fichiers ont les mêmes inodes que les originaux. Ce sont donc des fichiers liées.\\
 +Le champs qui indique le nombre de lien physique (celui retourné par ''​%h''​),​ montre qu'il y a maintenant 4 fichiers liés (un seul fichier disposant de 4 noms).
 +
 +**__Remarque__ :** Pour le répertoire ''​rep1'',​ ce champs retourne 2 !
 +
 +==== Répertoires et lien physique ====
 +
 +Le système ne permet pas de créer un lien physique pour un répertoire :
 +
 +<code user>
 +ln rep1 rep2
 +</​code><​code>​
 +ln: rep1 : lien direct non permis pour un répertoire
 +</​code>​
 +
 +Même //root// ne peut le faire :
 +
 +<code root>
 +ln rep1 rep2
 +</​code><​code>​
 +ln: rep1 : lien direct non permis pour un répertoire
 +</​code>​
 +
 +Pourtant, le système en crée deux à chaque nouveau répertoire :
 +
 +  * ''​.''​ lié physiquement au répertoire créé,
 +  * Et ''​..''​ lié physiquement au répertoire parent.
 +
 +**__Rappel__ :** Dans un système de fichier, un répertoire est un fichier qui contient tous les noms des fichiers (et répertoires) de ce répertoire.
 +
 +Ces deux fichiers (''​.''​ et ''​..''​) commencent par un point, ce sont donc des fichiers cachés.\\
 +Ils sont visible avec l'​option ''​-a''​ de la commande ''​ls''​ (l'​option ''​-R''​ demande un listing récursif) :
 +
 +<code user>
 +ls -Ra
 +</​code><​code>​
 +.:
 +.  ..  lien2.txt ​ rep1  test2.txt
 +
 +./rep1:
 +.  ..  lien2.txt ​ test2.txt
 +</​code>​
 +
 +.. Ou s'ils sont directement nommés :
 +
 +<code user>
 +stat -c "%i %h %n" rep1 rep1/. rep1/.. . ~/test_lien
 +</​code><​code>​
 +8695636 2 rep1
 +8695636 2 rep1/.
 +8695247 3 rep1/..
 +8695247 3 .
 +8695247 3 /​home/​martin/​test_lien
 +</​code>​
 +
 +Ci-dessus est visible que :
 +
 +  * ''​rep1''​ et ''​rep1/​.''​ ont le même inode.
 +  * ''​.'',​ ''​test_lien''​ et ''​rep1/​..''​ ont le même inode.
 +
 +Ainsi un répertoire est lié physiquement 2 fois : Par son nom et par le fichier ''​.''​ qu'il contient.\\
 +Plus un (+1) lien physique par répertoire fils (sous-répertoire) qu'il contient.
 +
 +Par exemple, s'il est ajouté 4 autres répertoires au répertoire ''​test_lien''​ (cela lui fera cinq sous-répertoires),​ il sera alors lié 7 fois :
 +
 +<code user>
 +mkdir -v rep{2..5}
 +</​code><​code>​
 +mkdir: création du répertoire '​rep2'​
 +mkdir: création du répertoire '​rep3'​
 +mkdir: création du répertoire '​rep4'​
 +mkdir: création du répertoire '​rep5'​
 +</​code>​
 +
 +<code user>
 +stat -c "%i %h %n" ~/test_lien . rep*/..
 +</​code><​code>​
 +8695247 7 /​home/​martin/​test_lien
 +8695247 7 .
 +8695247 7 rep1/..
 +8695247 7 rep2/..
 +8695247 7 rep3/..
 +8695247 7 rep4/..
 +8695247 7 rep5/..
 +</​code>​
 +
 +----
 +
 +<code user>
 +rmdir rep{2..5}
 +</​code>​
  
 ==== Suppression des fichiers ==== ==== Suppression des fichiers ====
  
-Suppression du fichier cible ''​test2.txt''​ :+Supprimer des fichiers liés n’altère en rien ceux qui restent. 
 + 
 +**__Note__ :** La commande ​''​rm -r //<​chemin_répertoire>//''​ permet de supprimer un répertoire non vide (et tout ce qu'il contient, sous-répertoires compris) 
 + 
 +<code user> 
 +rm -rv rep1 
 +</​code><​code>​ 
 +'​rep1/​lien2.txt'​ supprimé 
 +'rep1/test2.txt' ​supprimé 
 +répertoire ​'rep1' supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +ls -li 
 +</​code><​code>​ 
 +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 
 +</​code>​ 
 + 
 +Même supprimer le fichier original (qui en réalité ne peut plus être distingué),​ ne supprime pas les autres fichiers qui lui ont été liés : 
 <code user> <code user>
 rm test2.txt rm test2.txt
-ls -l+ls -li
 </​code><​code>​ </​code><​code>​
-total 4 +8667149 ​-rw-r--r-- 1 martin martin 32 déc 15 13:52 lien2.txt
--rw-r--r-- 1 martin martin 32 déc 15 13:52 lien2.txt+
 </​code>​ </​code>​
 +
  
 Comme dit le captnfab dans sa relecture : \\ 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é.+Il est à remarquer que le chiffre ​indiquant le nombre de fichier lié est passé à ''​1''​ car il n'y a plus d'​autre ​fichier lié.\\ 
 +(Il ne reste plus qu'un seul nom lié à l'​inode du fichier).
  
-<note tip>​Chacun ​des fichiers liés par un lien physique survit nominalement et physiquement à l'​effacement de l'​autre.</​note>​+Pour supprimer définitivement ​des fichiers liés, tous doivent être supprimés.
  
-Pour supprimer définitivement les deux fichiers et leurs contenus, nous devons les effacer tous deux. 
 <code user> <code user>
-rm *2.txt+rm lien2.txt
 ls -l ls -l
 </​code><​code>​ </​code><​code>​
 total 0 total 0
 </​code>​ </​code>​
- 
-//Voilà pour la commande //''​ln''//​ dans tous ses états !// 
- 
-//Merci au //​**captnfab**//​ pour sa bienveillante et rigolote attention !// :-D 
  
 ===== Conclusion ===== ===== Conclusion =====
Ligne 542: Ligne 1033:
  
 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. 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.
 +
 +//Voilà pour la commande //''​ln''//​ dans tous ses états !//
 +
 +//Merci au //​**captnfab**//​ pour sa bienveillante et rigolote attention !// :-D
  
doc/systeme/ln.1723383322.txt.gz · Dernière modification: 11/08/2024 15:35 par agp91

Pied de page des forums

Propulsé par FluxBB