Soft Link & Hard Link

Comment différencier un lien symbolique (soft) d’un lien en dur sous Linux. Pour rappel, un lien se créé avec la commande ln. Pour les dossiers, seuls les liens symboliques sont possibles :

# ln MonFichier hardLink
# ln -s MonFichier symbolicLink
HardLink SoftLink
Accessible en utilisant plusieurs noms Accessible par de nombreuses références pointant vers le fichier originel
Si fichier d’origine supprimé : lien toujours accessible Si fichier d’origine supprimé : lien invalide
N° d’inode simlaire N° d’inode différent
ln fichier nomLien ln -s fichier nomLien
Consomme moins de mémoire Consomme plus de mémoire
Lié qu’à sa propre partition Peut être lié à d’autres systèmes de fichiers et être mis en réseau
Pas de chemin relatif Chemin relatif

Suivre les liens symboliques

Il existe 4 commandes pouvant donner des détails sur un lien :

# ls
# readlink
# realpath
# stat
# file

Commande ls

Pour lister les liens symboliques, l’utilisation de -l affichera la lettre l en début de chaque ligne :

# ls -l

Pour lister les liens symboliques, l’utilisation de -F affichera le caratère @ en fin de chaque lien :

# ln -F

Exemple :

# ls -F
MonFichier MonFichierHardLink2 MonFichierSoftLink2@ monRepertoireSoftLink1@
MonFichierHardLink1 MonFichierSoftLink1@ monRepertoire/

Les soft links ont des inodes différents alors que ceux des hard links sont similaires :

# ls -li
4982588 -rw-r--r-- 3 john john 0 5 mars 12:45 MonFichier
4982588 -rw-r--r-- 3 john john 0 5 mars 12:45 MonFichierHardLink1
4982588 -rw-r--r-- 3 john john 0 5 mars 12:45 MonFichierHardLink2
4982591 lrwxrwxrwx 1 john john 7 5 mars 12:46 MonFichierSoftLink1 -> MonFichier
4982590 lrwxrwxrwx 1 john john 7 5 mars 12:46 MonFichierSoftLink2 -> MonFichier
5113257 drwxr-xr-x 2 john john 4096 5 mars 12:46 monRepertoire
4982592 lrwxrwxrwx 1 john john 10 5 mars 12:47 monRepertoireSoftLink1 -> monRepertoire

La commande readlink affiche le chemin réel d’un lien symbolique ou le nom canonique d’un fichier

# readlink FichierSoftLink1
Fichier

Commande realpath

La commande realpath affiche le chemin absolu d’un fichier

# realpath repertoireSoftLink1
/home/usr/testlink/TESTLink/repertoire

Commande file

La commande file détermine le type d’un fichier

file FichierSoftLink2
FichierSoftLink2: symbolic link to Fichier

file FichierHardLink1
FichierHardLink1: ASCII text

Commande stat

La commande stat affiche l’état d’un fichier ou d’un système de fichiers

# stat FichierSoftLink2
Fichier : FichierSoftLink2 -> Fichier
Taille : 7 Blocs : 0 Blocs d'E/S : 4096 lien symbolique
Périphérique : fe00h/65024d Inœud : 4982590 Liens : 1
Accès : (0777/lrwxrwxrwx) UID : ( 1000/ usr) GID : ( 1000/ usr)
Accès : 2023-03-07 12:47:27.912624532 +0100
Modif. : 2023-03-07 12:46:11.901120959 +0100
Changt : 2023-03-07 12:46:11.901120959 +0100
Créé : 2023-03-07 12:46:11.901120959 +0100

Lister tous les liens en dur, la commande awk permet de lister les mêmes inodes en récupérant le champs %i de stat :

stat -c '%i %n' * | awk 'Doublon[$1]++' | cut -d ' ' -f 2-

En inversant la commande, uniquement tous les liens symboliques peuvent être listés, (mais ainsi que les répertoires et les fichiers, qui ont leur unique inode):

stat -c '%i %n' * | awk '!Doublon[$1]++' | cut -d ' ' -f 2-

Documentation

https://unix.stackexchange.com/questions/167610/determining-if-a-file-is-a-hard-link-or-symbolic-link
https://linuxhandbook.com/symbolic-link-linux/
https://linuxhandbook.com/follow-symbolic-link/
https://www.tutorialspoint.com/unix_commands/ls.htm
https://www.tutorialspoint.com/difference-between-hard-link-and-soft-link
https://stackoverflow.com/questions/16282618/finding-files-that-are-not-hard-links-via-a-shell-script

> Partager <