Vérifiez si deux chemins pointent vers le même fichier


12

J'ai un script pour créer récursivement des liens symboliques dans mon répertoire personnel vers mon répertoire de paramètres, pour garder les fichiers sous contrôle de version. Je voudrais qu'il ignore les fichiers qui sont déjà liés par un lien parent via un répertoire parent. Autrement dit, si j'ai ces fichiers / répertoires:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

, comment puis-je vérifier que ~ / foo / bar et ~ / settings / foo / bar sont le même fichier?

Edit : D'oh, encore quelques minutes de recherche ont révélé la réponse :readlink -f $path

Réponses:


6

Si deux fichiers ont le même ID d'appareil et le même inode, ils sont le même fichier. L' statoutil de ligne de commande facilite la recherche

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

cela fonctionne pour les fichiers liés ou les fichiers liés.


5
Pour suivre les liens symboliques, vous avez besoin stat -L.
Gilles 'SO- arrête d'être méchant'

Comme @Gilles l'a dit, sans le commutateur -L, vous pouvez obtenir des résultats erronés sur certaines distributions
Olaseni

18

De nombreux shells ont un -efopérateur pour la fonction testintégrée (ou son synonyme [) pour tester si deux chemins pointent vers le même fichier existant (en suivant les liens symboliques). Cela inclut bash, dash, pdksh, ksh88, ksh93 et ​​zsh, mais pas POSIX sh. En bash, ksh ou zsh, vous pouvez également utiliser -efdans la [[ … ]]construction conditionnelle.

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
Selon ma page de manuel, -ef fait exactement la même chose que la réponse de Rich Homolka.
user13852

2
@ user13852 -efa l'avantage d'être plus portable (également légèrement plus rapide, mais pas pour que vous le remarquiez la plupart du temps). Par exemple, il fonctionne sur * BSD, OSX, BusyBox ainsi que Linux / Cygwin (GNU). C'est aussi plus clair, car il fait exactement ce qui est requis. Le seul avantage que je peux voir à appeler, statc'est quand vous ne voulez pas suivre les liens symboliques.
Gilles 'SO- arrête d'être méchant'

0

Pour les liens logiciels (créés avec ln -s), vous pouvez utiliser realpath. Cela ne fonctionnera pas pour les liens physiques.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.