La bonne et la meilleure manière
Les liens symboliques sont un excellent moyen d'organiser vos fichiers, mais ils ne sont pas parfaits. Les liens symboliques sont assez fragiles et il est facile de se retrouver avec des liens pointant vers des fichiers inexistants. Le programme find peut vous aider à résoudre ce problème, mais il existe un outil tiers qui fait encore mieux le travail.
Sommaire
Qu'est-ce qu'un lien symbolique rompu et pourquoi est-ce important ?
Un lien symbolique rompu pointe vers un fichier qui n'existe pas. Cela peut s'être produit de deux manières :
-
Lien vers un fichier qui n'a jamais existé. Vous pouvez essayer vous-même en passant un nom de fichier inexistant à ln, par exemple : ln -s le fichier n'existe pas.
-
Créer un lien vers un fichier existant, puis supprimer ce fichier, par exemple : ln -s lien de fichier vers le fichier ; fichier rm.
Ces liens symboliques rompus sont parfois appelés « liens suspendus » et ils peuvent être problématiques car ils sont susceptibles de briser quelque chose d'autre, c'est-à-dire ce qui était initialement prévu pour les utiliser. Les programmes ne traitent pas toujours les liens rompus de manière cohérente :
ls ne distingue même pas un lien rompu d'un lien normal, ce qui les rend beaucoup plus difficiles à repérer au passage.
De nombreux outils GNU génèrent un message d'erreur légèrement déroutant : « Trop de niveaux de liens symboliques ». Ceci est expliqué dans la documentation de la fonction de bibliothèque ouverte sous-jacente, qui décrit l'erreur ELOOP :
(ELOUP)
Trop de liens symboliques sont rencontrés lors de la traduction du nom de chemin. Ceci est considéré comme indicatif d’un lien symbolique en boucle.
Heureusement, la commande file donne une erreur plus utile :
Cela est logique car le but de la commande file est de fournir des informations sur le type d'un fichier, tandis que wc et la plupart tentent d'effectuer d'autres tâches sur le contenu de ce fichier.
Les liens brisés peuvent encombrer votre système de fichiers, occupant de l'espace sans aucun avantage. Ils peuvent également produire des résultats confus ou simplement des erreurs indésirables lorsque des programmes fonctionnant sur de nombreux fichiers les rencontrent. Il est facile de perdre la trace d'un lien rompu dans un répertoire profond, puis de rencontrer des problèmes avec find ou grep récursif.
Certains programmes indiquent les liens rompus, comme eza, qui les affiche en rouge :
Comment trouver des liens suspendus à l'aide de la commande find
La commande find est un outil fiable, parfait pour toutes sortes de recherches de fichiers. Que vous souhaitiez des fichiers récemment modifiés, des fichiers appartenant à un utilisateur spécifique ou des répertoires vides, il existe un moyen d'utiliser find qui vous aidera. Et cela inclut la recherche de liens symboliques :
find . -type l
L'option -type l restreint les correspondances aux liens symboliques uniquement, ce qui permet d'affiner la recherche, mais le prochain défi consiste à identifier lesquels de ces liens sont rompus. La solution dépend de la version de find que vous utilisez.
La recherche GNU moderne est la plus utile car elle prend en charge une option -xtype :
find . -xtype l
L'option -xtype signifie, en fait, « résoudre les chaînes de liens symboliques avant de tester ce type ». Étant donné qu'un fichier ne peut rester un lien qu'en cas d'échec de cette résolution, les fichiers résultants doivent être des liens rompus.
Les anciennes versions de find, y compris celle installée sur macOS Tahoe, peuvent ne pas prendre en charge cet argument, vous aurez donc besoin d'une alternative. Heureusement, il existe l'option -L. Cela fait à peu près la même chose que -xtype, mais cela ne vérifie pas le type du fichier ; il essaie simplement de résoudre tous les liens. Vous devrez toujours utiliser la vérification -type en conjonction avec celle-ci :
find -L . -type l
L'autre grande différence, cependant, est que -L suit les liens symboliques lors de la descente récursive de find dans les répertoires. Si vous avez un lien étrange dans un répertoire profond qui pointe vers / (c'est-à-dire la racine), vous finirez par effectuer une recherche dans tout le système de fichiers. Vous ne voulez probablement pas faire cela, c'est pourquoi -L n'est pas la valeur par défaut.
Une solution à ce problème consiste à utiliser find pour rechercher tous les liens symboliques, puis à utiliser son option -exec pour vérifier que chaque fichier existe :
find . -type l -exec test ! -e {} ; -print
Cette commande est un peu lourde, mais elle fonctionne. L'option «-type l» recherche les liens, comme auparavant, puis «-exec» appelle la commande test en utilisant l'indicateur -e pour rechercher les fichiers qui n'existent pas. Enfin, la partie « imprimer » affiche le nom du fichier.
Si vous essayez de trouver des liens symboliques rompus sur un Linux moderne, « find -xtype l » devrait suffire. En fait, vous pouvez utiliser la commande find pour supprimer les liens symboliques rompus, encore une fois, en profitant de l'option -exec :
find . -xtype l -exec rm {} ;
Mais vous voudrez d'abord vérifier ces liens et, encore une fois, la commande macOS équivalente devient encore plus gênante. Vous souhaiterez peut-être configurer un alias ou créer une fonction shell pour éviter d'avoir à vous en souvenir. Ou, vous pourriez utiliser une meilleure alternative…
Utilisation du programme de liens symboliques pour rechercher et réparer les liens brisés
Si vous trouvez les méthodes ci-dessus lourdes ou si vous rencontrez régulièrement des problèmes de liens symboliques, vous devriez envisager l'outil de liens symboliques. Ce petit programme C peut localiser plusieurs types de liens problématiques, y compris ceux rompus.
Parce que c'est si simple, il n'y a pas de méthode d'installation sophistiquée, vous devrez donc le construire à partir des sources. Heureusement, sa simplicité signifie également que vous ne devriez rencontrer aucun problème.
Téléchargez le référentiel GitHub du programme et suivez le processus de construction classique en trois étapes :
./configure
make
make install
Les utilisateurs de macOS n'auront pas de compilateur C par défaut et devront installer les outils de ligne de commande d'Apple pour créer des liens symboliques. Commencez par courir xcode-select –installer.
Une fois le programme installé, vous êtes prêt à l'exécuter en lui passant un chemin de répertoire à rechercher, par exemple :
symlinks ~/
Il se peut que vous n'obteniez aucun résultat avec cette commande ; par défaut, il ne revient pas dans les sous-répertoires. L'option -r fait cela et découvrira probablement de nombreux liens problématiques sur votre système de fichiers. En fait, lorsque j'ai exécuté pour la première fois « symlinks -r ~/ | wc -l », mon système a signalé un énorme 16 617 ! Mes liens symboliques sont clairement très mal organisés.
Cependant, tous ces liens ne sont pas rompus. symlinks signale quatre types de liens imparfaits :
-
Cassé (pendant).
-
Absolu : de tels liens peuvent entraîner des problèmes avec les points de montage.
-
Désordonné : liens avec des fichiers . ou/sur leur passage.
-
Long : liens avec des inutiles.. sur leur passage. Signalé uniquement lorsque l'option -s est utilisée.
Ces problèmes surviennent parce que le programme que vous utilisez pour créer des liens, ln, ne vérifie ni ne normalise vraiment le chemin que vous lui transmettez. Le meilleur qu'il offre est l'option -w, qui vous avertit si vous créez un lien suspendu, mais continue et le crée. La commande ln n'offre aucune protection contre ces autres types de liens problématiques.
les liens symboliques peuvent également vous aider à nettoyer ces liens, avec deux types de correctifs.
Tout d’abord, il y a l’option -d, qui supprime les liens en suspens. Si vous voulez une vie facile, c'est le moyen le plus rapide de vous débarrasser de ces fichiers inutiles. Cependant, vous souhaiterez peut-être d'abord consulter la liste des liens en suspens, car il peut être possible de les réparer manuellement. Par exemple, si vous avez renommé un répertoire et rompu un ensemble de liens, vous pouvez reconstruire chaque lien manuellement.
La deuxième option est -c, et cela corrige les liens absolus, les liens désordonnés et, avec l'option -s, les liens longs. C’est une option assez nucléaire à mon avis ; ces types de liens symboliques sont moins problématiques que les liens purement rompus. Je ne m'embêterais moi-même avec cette option que si j'utilisais régulièrement différents points de montage pour mes systèmes de fichiers, afin d'éviter des problèmes avec les liens absolus.
