2009-07-29 16 views
35

¿Cómo puedo tomar una ruta determinada en bash y convertirla a su forma canónica, eliminando referencias de enlaces simbólicos que puedan estar contenidos en la ruta?¿Cómo puedo quitar los enlaces simbólicos en bash?

Por ejemplo:

~$ 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 

¿Cómo puedo obtener la ruta canónica llena de /tmp/symtest/foo/bar/cat (es decir: /tmp/symtest/cat)?

+0

Gracias por eso. Mi búsqueda-fu no encontró esa pregunta. –

+0

Sin preocupaciones. Solo sabía buscarlo porque lo pedí. :) –

Respuesta

51

Gracias a Andy Skelton, parece que la respuesta es readlink -f:

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

He aquí una función que va a resolver los enlaces simbólicos
Su propósito original es para resolver la ruta completa de la secuencia de comandos que llama apuntado por una/usr/bin enlace simbólico

# 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 

no usar recursividad pero por otra parte nunca he utilizado la recursividad en bash

+4

Um, ¿qué? Esto es innecesariamente complicado, replicando la funcionalidad estándar 'readlink -f' sin necesidad. Sin mencionar que la respuesta correcta fue publicada hace 3 años ... – cha0site

+1

P.S. Vea esta respuesta SO: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac para una solución más segura para los sistemas que don 't tiene 'readlink -f', como Mac OS X. – cha0site

Cuestiones relacionadas