2010-11-15 23 views

Respuesta

15
ln -sf "$(readlink -f "$link")" "$link" 
+0

+1, no sabía acerca de las opciones de canonicalización para readlink! – Flexo

+1

Puede hacer esto para todos los enlaces simbólicos en el directorio de trabajo actual usando: 'find ./ -type l -execdir bash -c 'ln -sfn" $ (readlink -f "$ 0") "" $ 0 "' {} \ ; ' –

+0

Para los enlaces simbólicos que apuntan a directorios, esto falla: crea nuevos enlaces simbólicos con el mismo nombre dentro del directorio (por ejemplo, para un enlace simbólico foo -> ../foo obtienes foo/foo ->/abs/ruta/a/foo) . –

5

Sólo en caso de que alguien en busca de operación inversa: la conversión de los enlaces absolutos al respecto:

usando Python:

find . -lname "`pwd`*" -exec sh -c 'ln -snvf `python -c "from os.path import *; print relpath(\"$(readlink {})\",dirname(\"{}\"))"` {}' \; 

Usando sólo bash y sed:

find . -lname "`pwd`/*" -depth 1 -exec sh -c 'ln -snvf `echo $(readlink {}) | sed "s|\`pwd\`|.|"` {}' \; 
find . -lname "`pwd`/*" -depth 2 -exec sh -c 'ln -snvf `echo $(readlink {}) | sed "s|\`pwd\`|..|"` {}' \; 
find . -lname "`pwd`/*" -depth 3 -exec sh -c 'ln -snvf `echo $(readlink {}) | sed "s|\`pwd\`|../..|"` {}' \; 
etc.... 

Esto convertiría todos los enlaces absolutos en los subdirectorios en unos relativos.

+0

También hay un paquete de enlaces simbólicos disponible: 'symlinks -a/path/to/modify' http://linux.die.net/man/8/symlinks – pztrick

+0

Desafortunadamente no está disponible en algunos sistemas operativos. ; ( –

+0

Puede descargar el archivo fuente de Debian y simplemente ejecutar 'gcc symlinks.c -o/usr/local/bin/symlinks'. No parece depender de nada más. Http://http.debian.net/ debian/pool/main/s/symlinks/symlinks_1.4.orig.tar.gz – pztrick

0

Sobre la base de la respuesta de @ thkala, he añadido esto a mi .bashrc:

function lnabs { 
    #http://stackoverflow.com/questions/4187210/convert-relative-symbolic-links-to-absolute-symbolic-links 
    ln -sf "$(readlink -f "$1")" "$*" 
    } 
Cuestiones relacionadas