cClaude.rocks ☕ Le blog

L'informatique et les nouvelles technologies

Menu

Les liens symboliques sont pseudo-fichiers qui pointe sur un autre fichier. Ils ne doivent pas être confondus avec les raccourcis que l’on trouve fréquemment sous Windows. Les liens sont directement pris en compte au niveau du système d’exploitation et les programmes les traitent comme des fichiers ou des dossiers normaux.

Pour trouver les liens qui existe sur votre système Linux, vous pouvez utiliser la commande suivante depuis un terminal (Ctrl+Alt+T) :

find / -type l 2>/dev/null # Attention la liste complète risque d’être très longue
#
# Comme vous n’avez pas accès à l’intégralité du disque dur (et pour d’autres raisons)
# On ignore les erreurs à l’aide de la redirection : 2>/dev/null
#

Plus raisonnablement, vous pouvez voir l’ensemble des liens qui existe sous votre compte (il se peut qu’il n’y en ais pas)

find "${HOME}/" -type l

La commande find affiche uniquement les liens. Par défaut find ne suit pas les liens symboliques.

Cependant un lien symbolique (symbolic link en anglais) peut pointer vers un fichier ou un dossier qui n’existe plus…

Pour détecter si un lien symbolique est valide, on peut utiliser la commande test, sous la forme suivante :

test -e LE_LIEN ; echo $? # Affiche 0 si le lien est valide, 1 sinon.

Combinons les commandes find et test, on écrit alors :

find . -type l ! -exec test -e {} \; -print
  • find . – Recherche depuis le répertoire courant .. Vous pouvez remplacer le point par le nom de répertoire de votre choix.
  • -type l – filtre les liens
  • ! – Inverse le résultat de la commande suivante (« non » au sens booléen)
  • -exec test -e {} \; – Exécute la commande test sur le résultat courant (le fichier ou le répertoire qui est un lien). Où {} représente le résultat, \; indique la fin de la commande test.
  • -print – Affiche le résultat sous forme du nom de fichier avec son chemin.

Vous pouvez également utiliser :

find . -type l ! -exec test -e {} \; -ls
  • … voir plus haut
  • -ls – Affiche le résultat sous la même forme que la commande ls -l. Dans cette version vous aurez le nom du fichier et le chemin du lien associé. Attention -ls n’est pas disponible sur le pseudo-bash busybox.

Il est possible, d’utiliser la commande ls pour l’affichage, dans ce cas on utilisera un pipeline | suivit de while read pour relire la sortie :

find . -type l ! -exec test -e {} \; -print | while read -r L ; do ls -ls --color "${L}" ; done
  • … voir plus haut
  • | – Prend la sortie de la commande précédant, comme entrée de la commande suivante.
  • while … ; do … ; done – Traite la partie droite, tant que la partie gauche est vraie.
  • read -r L – xx
  • ls -ls --color "${L} – xx

Avec ce modèle, il est possible d’enchaîner les actions, par exemple, ici on supprime le lien après l’avoir affiché :

find . -type l ! -exec test -e {} \; -print | while read -r L ; do ls -ls --color "${L}" ; rm -v "${L}" ; done

D’autres astuces autour des liens et de la commande find :

Affiche les liens, ainsi que leur chemin relatif vers la cible (fichier ou répertoire) :

while read -r D ; do echo "$D -> $( realpath "$D" --relative-to=. )" ; done < <( find . -type l )

La même chose, mais ignore les liens du répertoire initial.

while read -r D ; do echo "$D -> $( realpath "$D" --relative-to=. )" ; done < <( find . -mindepth 2 -type l )

Format plus générique de la commande précédente, permettant de changer le répertoire de départ :

DIR=. ; while read -r D ; do echo "$D -> $( realpath "$D" --relative-to="${DIR}" )" ; done < <( find "${DIR}" -mindepth 2 -type l )

Pour aller plus loin

ᦿ


ℹ 2006 - 2021 | 🕸 Retour à l'accueil du domaine | 🏡 Retour à l'accueil du blog