====== ln ====== * Objet: commande ln * Niveau requis :{{tag>débutant avisé}} * Commentaires : // Permet de créer des liens physiques ou symboliques // * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-) * [[:doc:programmation:shell:chevrons | La commande chevron ">"]] * [[:doc:systeme:ls | La commande ls]] * [[:doc:systeme:rm | La commande rm]] * [[:doc:systeme:droits-unix | Les droits]] * [[:doc:editeurs:nano | La commande d'édition nano]] * Suivi : {{tag>à-compléter}}{{tag>à-tester}} * Création par [[user>smolski]] le 21/06/2010 * Testé par [[user>agp91]] le 04/07/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 !)) =====Introduction===== 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. ===== Synopsis ===== ln [option] == Lien symbolique : == ln -s ln -s == Lien physique : == ln **ATTENTION :** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible ! ===== Description ===== On distingue 2 sortes de lien : les liens durs et les liens symboliques. == Les liens symboliques (symlink) == 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é. == Les liens physiques ou durs (hardlink) == 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 :** \\ Il semble que le système de fichier //privateur// ''ntfs'' __ne soit pas capable__ de gérer des ''hardlink'' (ni des ''symlink'') avec lui-même, sinon d'une manière incomplète et //très très à la con// en fait. :-) //Merci de ces remarques habiles au concert de //**Mahoru`Tsunemi**// et de //**captnfab**// sur l'IRC.// ===== Préparatifs ===== 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 [[:doc:systeme:mkdir|mkdir]] et s'y positionner avec [[:doc:programmation:shell:cd | cd]] : cd mkdir test_lien cd test_lien Créer dans ce répertoire un fichiers vide, ''test1.txt'', avec [[:doc:systeme:touch|touch]], puis ajoutez-y le texte //Bonjour toto// avec la commande [[:doc:systeme:echo|echo]]. touch test1.txt echo Bonjour Jojo > test1.txt On vérifie avec la commande [[:doc:systeme:cat|cat]] que notre texte est bien écrit dans le fichier test1.txt : cat test1.txt Bonjour Jojo ===== Les liens symboliques (symlink) : ===== Situation de départ : ls -l total 4 -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt ==== Créer un lien symbolique ==== On crée le lien symbolique : ln -s test1.txt lien1.txt Ce qui nous fait maintenant : ls -l total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1.txt -> test1.txt -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt Attardons-nous un peu sur la ligne : ''**l**rwxrwxrwx 1 martin martin **9** déc 14 22:05 lien1.txt **-> test1.txt**'' - Dans le 1er champ (''lrwxrwxrwx''), la première lettre : **''l''**, indique que ce fichier est un lien symbolique. - Dans le 5em champ, le chiffre **''9''**, indique l'occupation en octet du fichier. - **''-> test1.txt''** indique le fichier que désigne le lien symbolique. Précisons aussi que : * La taille (occupation disque) d'un //fichier d'un lien symbolique// ne correspond pas à l'occupation disque affichée du fichier cible. * Les modifications apportées au contenu d'un fichier (cible) désigné par un lien symbolique seront portées uniquement dans le fichier cible. * La destruction totale d'un lien symbolique ne détruit rien dans le fichier cible. ==== Modification du contenu ==== echo Comment vas-tu ? >> lien1.txt cat lien1.txt 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.txt -> 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 : - Aucune modification pour le fichier du lien symbolique - Effectif pour le fichier cible ==== Occupation concrète sur le disque ==== À l'aide de la commande ''ls -li'', nous pouvons voir l'occupation disque et comparer les chiffres indiquant les indexs respectifs des inodes de chacun des fichiers liés : ls -li total 4 8667148 lrwxrwxrwx 1 martin martin 9 déc 14 22:05 lien1.txt -> test1.txt 8667139 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt Cela implique qu'__il y a bien deux occupations différentes__ sur le disque, avec une occupation qui restera toujours fixe et minimale pour le fichier du lien symbolique. :-) ==== Suppression d'un lien symbolique ==== L'effacement du fichier du lien symbolique ''lien1.txt'' ne détruit ni le contenu, ni l'apparence du fichier cible ''test1.txt'' : rm lien1.txt 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.txt'' : ln -s test1.txt lien1.txt ls -l total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:13 lien1.txt -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt ==== Modification du nom d'un lien symbolique ==== Modifions le nom du fichier du lien symbolique ''lien1.txt'' à l'aide de la [[:doc:systeme:mv |commande mv]] : mv lien1.txt lien2.txt ls -l total 4 lrwxrwxrwx 1 martin martin 9 déc 14 22:13 lien2.txt -> test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt Tout reste fonctionnel et en place. :-) Pour poursuivre cette illustration dans la clarté, remettons le nommage du lien symbolique ''lien2.txt'' en ''lien1.txt''. mv lien2.txt lien1.txt ==== Modification du nom d'un fichier cible ==== 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.txt -> 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.txt'' se met en carafe (il alors est écrit en rouge dans le terminal //bash//). Il suffit : * De renommer le fichier cible ''test2.txt'' en ''test1.txt'', * Ou bien de recréer le lien symbolique ''lien1.txt'' 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.txt''\\ :!: Attention de ne pas intervertir les deux noms, car sinon ce sera le fichier cible qui sera écrasé. Et tout redevient effectif. Pour la suite du tuto, choisir de remettre le fichier cible en ''test1.txt'' mv test2.txt test1.txt ==== Modifications des droits ==== Depuis le début de cette illustration, nous voyons que les droits restent immuablement complets pour le fichier du lien symbolique ''lien1.txt''. rwx rwx rwx Essayons de les modifier. \\ Modifions la propriété du fichier du lien symbolique ''lien1.txt'' pour que //root// devienne le propriétaire. Situation de départ : ls -l total 4 lrwxrwxrwx 1 martin martin 9 déc 14 23:00 lien1.txt -> test1.txt -rw-r--r-- 1 martin martin 13 déc 14 22:59 test1.txt En terminal root, changez les droits sur le fichier avec la commande [[:doc:systeme:chmod|chmod]] : chmod 700 lien1.txt On obtient alors : ls -l total 4 lrwxrwxrwx 1 martin martin 9 déc 14 23:00 lien1.txt -> test1.txt -rwx------ 1 martin martin 13 déc 14 22:59 test1.txt Nous voyons que le fichier du lien symbolique ''lien1.txt'' n'est pas affecté par cette modifications des droits : lrwxrwxrwx 1 martin martin 9 déc 14 23:00 lien1.txt -> test1.txt Et que le fichier cible ''test1.txt'' s'en trouve directement rectifié par cette commande exécuter sur le fichier du lien symbolique ''lien1.txt'' : rwx------ 1 martin martin 13 déc 14 22:59 test1.txt ===== Les liens physiques (hardlink) : ===== 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. **ATTENTION :** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible ! ==== Créer un lien physique ==== 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'' Le second champ retourné par le commande ''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. * Etc. Une autre différence est le partage des droits qui sont là __tout à fait identiques__ entre les fichiers liés physiquement. ==== Modifications du contenu des fichiers ==== 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. ==== Occupation concrète 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 : 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 !// :-D ==== Suppression des fichiers ==== 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é. Chacun des fichiers liés par un lien physique survit nominalement et physiquement à l'effacement de l'autre. 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 !// :-D ===== Conclusion ===== 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.