2009-07-29 11 views
35

Comment puis-je prendre un chemin donné dans bash et le convertir en sa forme canonique, en déréférençant les liens symboliques qui peuvent être contenus dans le chemin?Comment puis-je déréférencer les liens symboliques dans bash?

Par exemple:

~$ mkdir /tmp/symtest 
~$ cd /tmp/symtest/ 
/tmp/symtest$ mkdir -p foo/bar cat/dog 
/tmp/symtest$ cd foo/bar/ 
/tmp/symtest/foo/bar$ ln -s ../../cat cat 
/tmp/symtest/foo/bat$ cd ../../ 
/tmp/symtest$ tree 
. 
|-- cat 
| `-- dog 
`-- foo 
    `-- bar 
     `-- cat -> ../../cat 

6 directories, 0 files 

Comment puis-je obtenir le chemin canonique complet de /tmp/symtest/foo/bar/cat (i.e.: /tmp/symtest/cat)?

+0

Merci pour cela. Mon search-fu n'a pas trouvé cette question. –

+0

Pas de soucis. J'ai seulement su le chercher parce que je le lui ai demandé. :) –

Répondre

51

Merci à Andy Skelton, il semble que la réponse est readlink -f:

$:/tmp/symtest$ readlink -f /tmp/symtest/foo/bar/cat 
/tmp/symtest/cat 
-5

Voici une fonction qui permettra de résoudre les liens symboliques
Son but initial est de résoudre le chemin complet du script appelant pointé par un/usr/bin symlink

# resolve symbolic links 
function resolve_link() { 
    local LINK_FILE=${1:-${BASH_SOURCE[0]}} 
    local FILE_TYPE=`file $LINK_FILE | awk '{print $2}'` 
    local LINK_TO=$LINK_FILE 
    while [ $FILE_TYPE = "symbolic" ]; do 
    LINK_TO=`readlink $LINK_FILE` 
    FILE_TYPE=`file $LINK_TO | awk '{print $2}'` 
    done 
    echo $LINK_TO 
} 

BASH_SOURCE_RESOLVED=$(resolve_link) 
echo $BASH_SOURCE_RESOLVED 

Il n'utilise pas récursion mais là encore je ne l'ai jamais utilisé récursion dans bash

+4

Um, quoi? Ceci est inutilement compliqué, répliquant la fonctionnalité 'readlink -f' standard sans besoin. Sans oublier que la bonne réponse a été postée il y a 3 ans ... – cha0site

+1

P.S. Voir cette réponse SO: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac pour une solution plus saine pour les systèmes qui ne N'ont pas 'readlink -f', comme Mac OS X. – cha0site

Questions connexes