cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, sciences et coups de gueule…]

Menu
đŸ˜€ Ce billet a Ă©tĂ© Ă©ditĂ© le : 2022-05-29

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 Bad Links
  • 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} – On utilise ls pour afficher les caractĂ©ristiques du fichier.

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}" ; unlink "${L}" ; done

Notez qu’ici, on n’utilise pas la commande rm mais plutît unlink qui dans sa version GNU n’efface que les liens.

  • Solution plus radicale

    Une solution plus rapide et plus radicale, consiste à utiliser l’option -delete de la commande find (attention elle n’est pas disponible sur certain Linux (par exemple les NAS) :

    find . -type l ! -exec test -e {} \; -print -delete
    

    On peut mĂȘme aller plus vite, si on ne souhaite aucun retour sur ce qui a Ă©tĂ© fait en supprimant l’option -print.


ඏ

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 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog