Wie überschreibe / aktualisiere ich einen Symlink?

188

Ich versuche symbolische Links zu verwenden. Ich habe ein bisschen gelesen und die folgenden Befehle gefunden:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Kreationen und Löschungen funktionieren gut. Aber Updates funktionieren nicht. Nach dem Ausführen dieses Befehls wird der Symlink ungültig.

Ich habe hier und da gelesen, dass es nicht möglich ist, einen Symlink zu aktualisieren / zu überschreiben. Es gibt also widersprüchliche Informationen im Netz. Wer hat Recht? Wie kann ich dies erreichen, wenn ein Symlink aktualisiert / überschrieben werden kann?

Aktualisieren

Hier ist meine Verzeichnisstruktur:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Ab ~/scripts/test/wann ich aufführe:

ln -s /remote_loc/site1 test_link

a test_linkist erschaffen und ich kann ls -les, aber es scheint kaputt zu sein (entgegen dem, was ich oben in meiner Frage gesagt habe).

Wie kann ich eine Verknüpfung auf mehreren Verzeichnisebenen durchführen?

Jérôme Verstrynge
quelle
1
Ich empfehle verwenden unlinkstatt rm. Mit unlinkriskieren Sie nie versehentlich mit falschen Schalter alle Dateien in einem Quellverzeichnis zu verlieren.
Jpsy
Sie verwenden ein führendes / in Ihrem Befehl
Jamie Cook
@jpsy dein rat zu unlink wäre sehr gut, wenn es wahr wäre . Versuchen Sie es mit zzzz. Verknüpfung zu zzzz aufheben. (Aufheben der Verknüpfung von Aufrufen, Aufheben der Verknüpfung wie bei rm, jedoch ohne ausgefallene Optionen und ohne Rekursion).
Strg-Alt-Delor
Warum verwenden -n? (Kann das Problem sein). Auch wenn Ihr ln unterstützt -tverwendet es dann, für diese Fälle, und -Toder destination/für andere Fälle.
Strg-Alt-Delor

Antworten:

150

Die Verwendung von -fwith lnüberschreibt jeden Link, der bereits vorhanden war. Solange Sie die richtigen Berechtigungen haben, sollte dies funktionieren. Es hat immer bei mir funktioniert. Welches Betriebssystem verwenden Sie?

Sirch
quelle
Ich habe meine Frage mit weiteren Informationen zu meinem Problem aktualisiert.
Jérôme Verstrynge
Ich bin unter Linux.
Jérôme Verstrynge
2
Wenn Sie die lnParameter ändern, wie ich es gerne tue, zerstört der -fSchalter dann Ihre vorhandenen Dateien (Verknüpfungsziele)? In beiden Fällen haben wir auch den -iParameter (der den Benutzer zum Überschreiben auffordert), wenn Sie etwas Sicherheit wünschen.
Palswim
2
@palswim Dieser SO-Beitrag impliziert, dass er sicher ist, weil -fnur Anrufe unlink()und link()unter der Haube: stackoverflow.com/a/1466570/157385 . Ich wünschte, ich würde mich nur an die richtige Reihenfolge erinnern!
Mike Branski
4
Funktioniert nicht. Bedürfnisse -n. Siehe akzeptierte Antwort.
Shawn Welch
119

Ok, ich habe festgestellt, wo mein Fehler liegt: man sollte nicht den ersten /in Pfad setzen.

Mit anderen Worten, die Befehle in meinen Fragen sollten sein:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

Anstatt von

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

wenn ich meinen Fall betrachte.

Jérôme Verstrynge
quelle
22
Für einige zusätzliche Informationen, warum das so ist, gibt es folgende Unterschiede: Einer ist ein relativePfad (ohne das führende /) und der andere ist ein absolutePfad (mit dem führenden /). Wenn Sie ein Linux-System verwalten, ist es entscheidend, dass Sie die Unterschiede verstehen. Zum Beispiel entscheidet der Unterschied zwischen rm -rf ./*und rm -rf /.*, ob Sie Ihren Job behalten oder nicht :)
Safado
5
Dies beantwortet nicht die Frage 'Wie aktualisiere / übersteuere ich einen Sym-Link'
Sirch
Die Zeile ln -sfn {Pfad / zu / Dateiname} {Linkname} ist ausreichend.
Jérôme Verstrynge
6
-n (--no-dereference) bewirkt, dass {link name} wie eine normale Datei behandelt wird, anstatt dem Link zu folgen. Da Sie diesen Link bearbeiten müssen, ohne ihm zu folgen, müssen Sie diese Option verwenden.
Feldoh
1
Diese Antwort sollte eine hervorgehobene Antwort mit einem -nParameter zum Ersetzen der Symbolverknüpfung sein.
Nick Tsai
12

Erste Ausgabe:

Ich zitiere Sie:

Kreationen und Löschungen funktionieren gut. Aber Updates funktionieren nicht. Nach dem Ausführen dieses Befehls wird der Symlink ungültig.

Das Problem mit der angegebenen Verzeichnisstruktur:

~ / scripts / test / ~ / scripts / test / remote_loc / ~ / scripts / test / remote_loc / site1 / ~ / scripts / test / remote_loc / site1 / stuff1.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts /test/remote_loc/site2/stuff2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / stuff3.txt

und mit dem Befehl:

ln -s /remote_loc/site1 test_link

Ist dies der Fall, dass eine symbolische Verknüpfung in Ihrem $ PWD oder Ihrem aktuellen Arbeitsverzeichnis erstellt wird, die auf eine nicht vorhandene Datei außerhalb von / oder root unter / remote_loc / site1 verweist

Wenn sich Ihre PWD in ~ / scripts / befindet, sollten Sie dies verwendet haben:

ln -s remote_loc/site1 test_link

Ansonsten hätten Sie den vollständigen absoluten Pfad wie folgt verwenden können:

ln -s /home/yourusername/remote_loc/site1 test_link

Zweite Ausgabe:

Ich zitiere Sie:

Ich habe hier und da gelesen, dass es nicht möglich ist, einen Symlink zu aktualisieren / zu überschreiben. Es gibt also widersprüchliche Informationen im Netz. Wer hat Recht? Wie kann ich dies erreichen, wenn ein Symlink aktualisiert / überschrieben werden kann?

Bei der Beantwortung Ihrer Frage "Wer hat Recht?" Bin ich mir nicht sicher, was Sie genau gelesen haben oder wie es verstanden wurde. Aber das Folgende sollte helfen aufzuklären:

  1. Was kann aktualisiert werden und
  2. Was kann nicht aktualisiert werden, ohne entsprechende Schalter zu verwenden.


Aktualisieren von symbolischen Links mit Zielen, die keine Verzeichnisse sind.

ln -sf:
Mit der Option -f oder --force werden vorhandene Zieldateien entfernt. Diese Option wird zum Aktualisieren des Ziels oder Ziels eines Links verwendet.

Beispiel:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Wie Sie jedoch sehen können, wird der absolute Pfad angegeben, wenn absolute Pfade in lnden Argumenten enthalten sind. Die Angabe eines vollständigen Pfads ist erforderlich, wenn sich das aktuelle Arbeitsverzeichnis vom übergeordneten Verzeichnis des Links unterscheidet.


Relative Pfade:

ln -sfr:
Mit -r oder --relative werden symbolische Links relativ zur Position des Links erstellt.

Beispiel:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Das Aktualisieren eines Links zu einem Verzeichnis funktioniert jedoch nicht, wenn das Ziel ein Verzeichnis ist.

Beispiel:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Wie Sie sehen, lnist der symbolische Link trotz der Verwendung der im obigen Argument angegebenen absoluten Pfadnamen ohne die Option -r immer noch relativ zum Link.


Aktualisieren Sie Links zu Verzeichnissen:

ln -sfrn:
Die Option -n oder --no-dereference behandelt LINK_NAME als normale Datei, wenn es sich um eine symbolische Verknüpfung zu einem Verzeichnis handelt.

Beispiel:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

Im Gegensatz zu:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir
Keith Reynolds
quelle
6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
jirib
quelle
Wenn ich Tests mit einer Verzeichnisebene durchführe, funktioniert es, aber ich versuche, Verzeichnisse mit mehreren Ebenen zu verwenden, und es funktioniert nicht. Ich habe meine Frage aktualisiert.
Jérôme Verstrynge