Deux files sont-ils liés?

Comment savoir si deux files sont liés à la command line? Par exemple, quelque chose lie ceci:

$ ls fileA fileB fileC $ is-hardlinked fileA fileB yes $ is-hardlinked fileA fileC no 

Sur la plupart des filesystems¹, un file est déterminé de manière unique par son numéro d' inode . Il suffit de vérifier si les deux files ont le même numéro d'inode et s'ils sont sur le même système de files.

Ash, ksh, bash et zsh ont une construction qui effectue la vérification pour vous: l'opérateur d'égalité de files -ef .

 [ fileA -ef fileB ] && ! [ fileA -ef fileC ] 

Pour les cas plus avancés, ls -i /path/to/file répertorie le numéro d'inode d'un file. df -P /path/to/file indique le système de files sur lequel se trouve le file (si deux files se trouvent dans le même directory, ils sont sur le même système de files). Si votre système possède la command stat , il peut probablement afficher les numéros d'inode et de système de files (les stat varient d'un système à l'autre, vérifiez votre documentation). Si vous voulez un rapide coup d'œil sur les liens dans un directory, essayez ls -i | sort ls -i | sort (éventuellement pipé à awk ).

¹ Tous les filesystems unix natifs, et quelques autres comme NTFS, mais peut-être pas des cas exotiques comme CramFS.

 function is-hardlinked() { r=yes [ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no echo $r } 

Comme le suggère la première affiche, vous pouvez écrire un script basé sur quelque chose comme ça sur Linux:

 stat -c '%i' fileA fileB fileC