Wie ändere ich einen symbolischen Link zu einem Verzeichnis auf ein anderes Ziel?

7
# ln -sv /path/to/target /path/to/link
‘/path/to/link’ -> ‘/path/to/target’

Jetzt möchte ich dieses Ziel durch target2 ersetzen:

# ln -sfv /path/to/target2 /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2’

Whoa! Was ist dort passiert? Nachgestellte Schrägstriche haben keinerlei Auswirkung:

ln -sfv /path/to/target2/ /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2/ /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2 /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2’

Wie zu erreichen ’/path/to/link’ -> ’/path/to/target2’ ?

Ars Magika
quelle

Antworten:

12

Benutzen -n / --no-dereference ("LINK_NAME als normale Datei behandeln, wenn es sich um eine symbolische Verknüpfung zu einem Verzeichnis handelt"):

$ ln -sv /var/log /tmp/my-link
‘/tmp/my-link’ -> ‘/var/log’
$ ln -sfnv /var/opt /tmp/my-link
‘/tmp/my-link’ -> ‘/var/opt’

Das ist, ln -s target link wird funktionieren wie ln -s target link/target ob link Links zu einem Verzeichnis .

Die meisten Linux-Befehlstools versuchen, symbolische Links zu dereferenzieren, bevor sie ihre Aktion ausführen. Andernfalls wären symbolische Links meist nur verwirrend und fast unbrauchbar. Ich denke das Original ln Die Autoren hielten in diesem Fall Konsistenz für wichtiger als ein gewisses Maß an Einfachheit (mit der Gefahr, dass Personen, die an andere Tools gewöhnt sind, verwirrt werden).

l0b0
quelle
Perfekt! Vielen Dank! Ein extra Dankeschön für die Erklärung, denn auch jetzt macht alles Sinn!
Ars Magika
2

Die Antwort von l0b0 ist gut. Es ist einfach und daher meistens die beste Option für die Verwendung in der Befehlszeile. In einigen Fällen ist es Ihnen jedoch wichtig, dass es nicht atomar ist. ln -sf Löscht zuerst den alten Symlink und erstellt dann den neuen. Es gibt also einen kurzen Zeitraum, in dem kein Symlink vorhanden ist.

Wenn Sie vorsichtig sein müssen, sollten Sie den neuen Symlink an einem temporären Speicherort erstellen mv es an Ort und Stelle.

Hier gibt es eine rubinrote Implementierung davon: http://blog.moertel.com/posts/2005-08-22-how-to-change-symlinks-atomically.html . Es wäre jedoch einfach in jeder Sprache zu implementieren. Überlegen Sie, warum es nicht das Standardverhalten von ln ist.

mc0e
quelle