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 →
Ci-dessous, les différences entre deux révisions de la page.
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:54] agp91 [Les liens symboliques (symlink)] : Ajout de la sous-section [Copies de lien symbolique] |
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 408: | Ligne 409: | ||
<code user> | <code user> | ||
mkdir rep1 | mkdir rep1 | ||
- | cp -v * rep1 | + | cp -v lien1 test1.txt rep1 |
</code><code> | </code><code> | ||
'lien1' -> 'rep1/lien1' | 'lien1' -> 'rep1/lien1' | ||
Ligne 438: | Ligne 439: | ||
<code user> | <code user> | ||
rm rep1/* | rm rep1/* | ||
- | cp -vP *.txt rep1 | + | cp -vP lien1 test1.txt rep1 |
</code><code> | </code><code> | ||
'lien1' -> 'rep1/lien1' | 'lien1' -> 'rep1/lien1' | ||
Ligne 450: | Ligne 451: | ||
</code><code> | </code><code> | ||
lrwxrwxrwx 1 martin martin 9 déc 14 22:22 rep1/lien1 -> test1.txt | lrwxrwxrwx 1 martin martin 9 déc 14 22:22 rep1/lien1 -> test1.txt | ||
- | -rw-r--r-- 1 martin martin 30 déc 14 22:22 rep1/test1.txt | + | -rw------- 1 martin martin 30 déc 14 22:22 rep1/test1.txt |
</code> | </code> | ||
Ligne 497: | Ligne 498: | ||
ls -l | ls -l | ||
</code><code> | </code><code> | ||
+ | total 8 | ||
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 | ||
lrwxrwxrwx 1 martin martin 32 déc 14 22:30 lien3 -> /home/martin/test_lien/test1.txt | lrwxrwxrwx 1 martin martin 32 déc 14 22:30 lien3 -> /home/martin/test_lien/test1.txt | ||
Ligne 518: | Ligne 520: | ||
</code> | </code> | ||
- | Contrairement à la copie du lien ''lien1'' (vers ''rep1/lien2''), la copie du lien ''lien3'' (vers ''rep1/lien4'') à conservé sa cible. | + | Contrairement à la copie du lien ''lien1'' (vers ''rep1/lien2''), la copie du lien ''lien3'' (vers ''rep1/lien4'') à conservé sa cible. |
<code user> | <code user> | ||
Ligne 527: | Ligne 529: | ||
</code> | </code> | ||
- | ===== Les liens physiques (hardlink) : ===== | + | ==== Répertoire et lien symbolique ==== |
- | Un lien physique est la création d'un fichier à l'identique de celui qu'il pointe. | + | Un lien symbolique peut cibler un répertoire. |
- | 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> |
+ | 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 : | ||
- | <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 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> | ||
- | ==== Créer un lien physique ==== | + | ---- |
- | Commençons par supprimer les fichiers liés symboliquement et créer un fichier de départ vide, test2, : | + | 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 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 552: | 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 566: | 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 616: | 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 628: | 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 669: | 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 | ||