Wie überschreibe ich einen symbolischen Link eines Verzeichnisses?

9238
ironsand

Es gibt zwei Verzeichnisse foo1und foo2.

Zuerst mache ich einen Verzeichnissymbollink durch ln -s foo1 bar. Danach möchte ich den Symlink ändern, also habe ich getipptln -sf foo2 bar

Ist baraber immer noch mit verbunden foo1. Symlink foo2wird innerhalb von erstellt foo1.

Was soll ich eingeben, wenn ich ersetzen wollen foo1durch foo2?

Ich habe in drei Umgebungen getestet.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (GNU coreutils) 8.4
  3. OS X 10.7.5, ln (ohne Version)
13

1 Antwort auf die Frage

15
Drew Chapin

Der richtige Weg, dies zu tun, ist, die --no-dereferenceOption so zu verwenden.

$ ln -snf foo2 bar 

Dies führt lndazu, dass der vorhandene Symlink als Datei behandelt wird. Andernfalls dereferenziert es barzu foo1, steigt in foo1und verwendet den ursprünglichen TARGETNamen wie die, LINK_NAMEund das ist, warum Sie mit einem Symlink am Ende zu im foo2Inneren des erstellt werden foo1Verzeichnis. Die Manpage on lnsagt folgendes aus ...

-n, - keine-Dereferenzierung Behandle LINK_NAME wie eine normale Datei, wenn es sich um einen symbolischen Link zu einem Verzeichnis 

Unten ist die Shell-Ausgabe auf meinem Arch Linux-Desktop mit Version 8.21 lnmit und ohne der --no-dereferenceOption. Ich habe die gleichen Ergebnisse erhalten, die Sie ohne die --no-dereferenceOption gemacht haben, aber mit der --no-dereferenceOption funktionierte sie wie erwartet.

$ mkdir foo1 foo2 $ ln -s foo1 bar $ ls -l bar lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1 $ ln -sf foo2 bar $ ls -l bar lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1 $ ls -l foo1 total 0 lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2 $ ln -snf foo2 bar $ ls -l bar lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2 
Danke für deine Antwort. Wenn es sich um ein umgebungsabhängiges Problem handelt, schreibe ich meine Umgebung. Welches Betriebssystem verwendest du? was gibt "ln --version" aus? ironsand vor 11 Jahren 0
Ich habe dies auf einer Fedora 18 VM mit Version 8.17 versucht. Interessanterweise habe ich dies auf meinem Arch Linux-Desktop mit Version 8.21 ausprobiert und die gleichen Ergebnisse erzielt wie Sie. Irgendwo zwischen diesen beiden Versionen scheint sich etwas geändert zu haben. Die Lösung, die ich veröffentlicht habe, funktionierte jedoch in beiden Fällen. Drew Chapin vor 11 Jahren 0
Zu Ihrer Information, ich fand diese Antwort in den [justlinux.com-Foren] (http://forums.justlinux.com/showthread.php?117847-why-doesn-t-ln-sf-work). Drew Chapin vor 11 Jahren 0
Danke, Druciferre! Ich hätte sogar nie gedacht, dass der `ln'-Befehl so oft aktualisiert wird. ironsand vor 11 Jahren 0
Ich habe auch in osx getestet. `ln` funktioniert genauso wie ubuntu und centos mit dem Verzeichnis überschreiben und` ln -snf` löst das Problem. Auch wenn "ln -h" in osx die bevorzugte Option ist. ironsand vor 11 Jahren 0
@Tetsu, ich habe es auch auf FreeBSD bestätigt. Drew Chapin vor 11 Jahren 0
Toll, das funktioniert sogar mit busybox; Danke vielmals! lpapp vor 9 Jahren 0