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
linux
symbolic-link
l0b0
la source
la source
stat -L
.De nombreux shells ont un
-ef
opérateur pour la fonctiontest
inté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-ef
dans la[[ … ]]
construction conditionnelle.la source
-ef
a 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,stat
c'est quand vous ne voulez pas suivre les liens symboliques.Pour les liens logiciels (créés avec
ln -s
), vous pouvez utiliserrealpath
. Cela ne fonctionnera pas pour les liens physiques.la source