Wie überschreibe ich einen symbolischen Link eines Verzeichnisses?

15

Es gibt zwei Verzeichnisse foo1und foo2.

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

Ist baraber immer noch verbunden mit 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)
Eisen und Sand
quelle

Antworten:

17

Der richtige Weg, dies zu tun, besteht darin, die -n, --no-dereferenceOption wie folgt zu verwenden .

$ ln -snf foo2 bar

Dadurch wird lnder vorhandene Symlink als Datei behandelt. Andernfalls wird auf den ursprünglichen Namen verwiesen bar, dieser foo1wird foo1verwendet, und aus diesem Grund wird ein Symlink erstellt, der im Verzeichnis erstellt wird. In der Manpage auf heißt es:TARGETLINK_NAMEfoo2foo1ln

-n, --keine Dereferenzierung
       Behandle LINK_NAME als normale Datei, wenn es sich um eine symbolische Verknüpfung zu a handelt
       Verzeichnis

Unten ist die Shell-Ausgabe auf meinem Arch Linux-Desktop mit der Version 8.21 lnmit und ohne --no-dereferenceOption aufgeführt. Ich habe die gleichen Ergebnisse erhalten, die Sie ohne die --no-dereferenceOption erzielt haben , aber mit der--no-dereference Option hat es wie erwartet funktioniert.

$ 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
Drew Chapin
quelle
Danke für deine Antwort. Wenn es ein umgebungsabhängiges Problem ist, schreibe ich meine Umgebung. Welches Betriebssystem verwenden Sie? welche ausgänge ln --version?
Ironsand
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 versucht und die gleichen Ergebnisse erzielt, die Sie erzielt haben. Irgendwo zwischen diesen beiden Versionen scheint sich etwas geändert zu haben. Die von mir gepostete Lösung funktionierte jedoch in beiden Fällen.
Drew Chapin
Zu Ihrer Information , ich habe diese Antwort in den Foren von justlinux.com gefunden .
Drew Chapin
Danke Druciferre! Ich hätte sogar nie gedacht, dass der lnBefehl so oft aktualisiert wird.
Eisen und
Ich habe es auch in osx getestet. lnfunktioniert genauso wie Ubuntu und Centos mit dem Verzeichnis überschreiben und ln -snfdas Problem lösen. Auch wenn ln -hist die Option bevorzugen, in osx zu verwenden.
Eisen und