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 commandetest
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 commandetest
.-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 commandels -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
â xxls -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
኿