Vous pouvez trouver le numéro d'inode de votre fichier avec
ls -i
et
ls -l
affiche le nombre de références (nombre de liens physiques vers un inode particulier)
après avoir trouvé le numéro d'inode, vous pouvez rechercher tous les fichiers avec le même inode :
find . -inum NUM
affichera les noms de fichiers pour l'inode NUM dans le répertoire actuel (.)
Il n'y a pas vraiment de réponse bien définie à votre question. Contrairement aux liens symboliques, les liens physiques sont indiscernables du "fichier d'origine".
Les entrées de répertoire se composent d'un nom de fichier et d'un pointeur vers un inode. L'inode contient à son tour les métadonnées du fichier et (des pointeurs vers) le contenu réel du fichier). La création d'un lien physique crée un autre nom de fichier + une référence au même inode. Ces références sont unidirectionnelles (au moins dans les systèmes de fichiers typiques) -- l'inode ne conserve qu'un nombre de références. Il n'existe aucun moyen intrinsèque de savoir quel est le nom de fichier "d'origine".
Au fait, c'est pourquoi l'appel système pour "supprimer" un fichier s'appelle unlink
. Il supprime simplement un lien physique. L'inode et les données attachées ne sont supprimés que si le nombre de références de l'inode tombe à 0.
La seule façon de trouver les autres références à un inode donné est de rechercher de manière exhaustive dans le système de fichiers en vérifiant quels fichiers font référence à l'inode en question. Vous pouvez utiliser 'test A -ef B' depuis le shell pour effectuer cette vérification.
UNIX a des liens physiques et des liens symboliques (faits avec "ln"
et "ln -s"
respectivement). Les liens symboliques sont simplement un fichier qui contient le chemin réel vers un autre fichier et peut traverser des systèmes de fichiers.
Les liens physiques existent depuis les premiers jours d'UNIX (dont je me souviens de toute façon, et cela remonte à un certain temps). Ce sont deux entrées de répertoire qui référencent le exact mêmes données sous-jacentes. Les données d'un fichier sont spécifiées par son inode
. Chaque fichier d'un système de fichiers pointe vers un inode, mais il n'est pas nécessaire que chaque fichier pointe vers un inode unique - c'est de là que proviennent les liens physiques.
Étant donné que les inodes ne sont uniques que pour un système de fichiers donné, il existe une limitation selon laquelle les liens physiques doivent se trouver sur le même système de fichiers (contrairement aux liens symboliques). Notez que, contrairement aux liens symboliques, il n'y a pas de fichier privilégié - ils sont tous égaux. La zone de données ne sera publiée que lorsque tous les fichiers utilisant cet inode sont supprimés (et tous les processus le ferment également, mais c'est un autre problème).
Vous pouvez utiliser le "ls -i"
commande pour obtenir l'inode d'un fichier particulier. Vous pouvez alors utiliser le "find <filesystemroot> -inum <inode>"
commande pour trouver tous les fichiers sur le système de fichiers avec cet inode donné.
Voici un script qui fait exactement cela. Vous l'invoquez avec :
findhardlinks ~/jquery.js
et il trouvera tous les fichiers sur ce système de fichiers qui sont des liens physiques pour ce fichier :
[email protected]:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
'/home/pax/jquery.js' has inode 5211995 on mount point '/'
/home/common/jquery-1.2.6.min.js
/home/pax/jquery.js
Voici le script.
#!/bin/bash
if [[ $# -lt 1 ]] ; then
echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
exit 1
fi
while [[ $# -ge 1 ]] ; do
echo "Processing '$1'"
if [[ ! -r "$1" ]] ; then
echo " '$1' is not accessible"
else
numlinks=$(ls -ld "$1" | awk '{print $2}')
inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
device=$(df "$1" | tail -1l | awk '{print $6}')
echo " '$1' has inode ${inode} on mount point '${device}'"
find ${device} -inum ${inode} 2>/dev/null | sed 's/^/ /'
fi
shift
done