2010-11-15 10 views

Antwort

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

+1, wusste nicht über die Canonicalization Optionen zu lesen! – Flexo

+1

Sie können dies für alle symbolischen Links unter dem aktuellen Arbeitsverzeichnis tun: 'find ./ -type l -execdir bash -c 'ln -sfn" $ (readlink -f "$ 0") "" $ 0 "' {} \ ; ' –

+0

Bei Symlinks, die auf Verzeichnisse verweisen, schlägt dies fehl: Es werden neue Symlinks mit demselben Namen innerhalb des Verzeichnisses erzeugt (zB für einen Symlink foo -> ../foo bekommst du foo/foo ->/abs/pfad/zu/foo) . –

5

Nur falls jemand suchen Rückwärtsbetrieb: Umwandlung von absoluten Links zu relativ:

Python:

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

nur bash verwenden und 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.... 

Dies würde alle absoluten Links in den Unterverzeichnissen in relative Verzeichnisse umwandeln.

+0

Es gibt auch ein Symlinks-Paket: 'symlinks -a/path/to/modify' http://linux.die.net/man/8/symlinks – pztrick

+0

Leider ist es auf einigen Betriebssystemen nicht verfügbar. ; ( –

+0

) Du kannst die Debian-Quelldatei herunterladen und einfach 'gcc symlinks.c -o/usr/local/bin/symlinks' ausführen. Scheint nicht von etwas anderem abhängig zu sein. Http://http.debian.net/ debian/pool/main/s/symlinks/symlinks_1.4.orig.tar.gz – pztrick

0

Basierend auf @ thkala Antwort, habe ich das meinen .bashrc:

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