Frage Wie man einen Symlink überschreibt / aktualisiert?


Ich versuche, symbolische Links zu verwenden. Ich habe etwas 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? Wenn ein Symlink aktualisiert / überschrieben werden kann, wie kann ich dies erreichen?

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

Von ~/scripts/test/Wenn ich Folgendes mache:

ln -s /remote_loc/site1 test_link

ein test_link ist geschaffen, und ich kann ls -l es, aber es scheint gebrochen (im Gegensatz zu dem, was ich oben in meiner Frage sagte).

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


150
2018-05-17 12:39


Ursprung


Ich empfehle zu verwenden unlink anstatt rm. Mit unlink Sie riskieren nie, Dateien in einem Quellverzeichnis zu verlieren, indem Sie versehentlich falsche Schalter verwenden. - Jpsy
Sie verwenden einen führenden / in Ihrem Befehl - Jamie Cook
@jpsy Ihr Rat über die Verknüpfung wäre sehr gut, wenn es wahr wäre. Versuchen Sie, berühren Sie zzzz; unlink zzzz. (entkoppeln Sie Anrufe, trennen Sie die Verbindung mit rm, aber ohne besondere Optionen und ohne Rekursion). - ctrl-alt-delor
Warum verwenden von -n? (kann das Problem sein). Auch wenn dein ln unterstützt -t dann benutze es für diese Fälle und -T oder destination/ für andere Fälle. - ctrl-alt-delor


Antworten:


Verwenden -f mit ln Überschreibt irgendeinen Link, der bereits dort war, so lange es die richtigen Berechtigungen hat, sollte es funktionieren ... Es hat immer für mich funktioniert. Welches Betriebssystem benutzen Sie?


124
2018-05-17 12:49



Ich habe meine Frage mit weiteren Informationen zu meinem Problem aktualisiert. - Jérôme Verstrynge
Ich bin unter Linux. - Jérôme Verstrynge
Wenn du das änderst ln Parameter, wie ich gerne tun würde, wird die -f Schalter zerstören Ihre vorhandenen Dateien (Linkziele)? In jedem Fall haben wir die -i Parameter (der den Benutzer zum Überschreiben auffordert), wenn Sie ein wenig Sicherheit wünschen. - palswim
@palswim Dieser SO Post bedeutet, dass es sicher ist, weil -f ruft einfach an 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
Funktioniert nicht. Bedürfnisse -n. Siehe akzeptierte Antwort. - Shawn Welch


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

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

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

in Anbetracht meines Falles.


91
2018-05-17 13:32



Für einige zusätzliche Informationen darüber, warum das ist, sind die Unterschiede eins ist a relative Pfad (ohne das führende /) und das andere ist ein absolute Pfad (mit dem führenden /). Wenn Sie ein Linux-System verwalten, ist es KRITISCH, dass Sie die Unterschiede verstehen. Zum Beispiel der Unterschied zwischen rm -rf ./* und rm -rf /.* entscheidet, ob Sie Ihren Job behalten oder nicht :) - Safado
Dies beantwortet nicht die Frage, wie man einen Symlink aktualisiert / überbrückt. - Sirch
Die Zeile ln -sfn {Pfad / zu / Dateiname} {link-name} funktioniert. - Jérôme Verstrynge
Welchen Unterschied macht das? -n Option machen? - dokaspar
-n (--no-dereference) bewirkt, dass {link name} wie eine normale Datei behandelt wird, anstatt dem Link zu folgen. Da Sie auf diesem Link nicht folgen müssen, müssen Sie diese Option verwenden. - feldoh


Erste Ausgabe:

Zitieren Sie:

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

Das Problem mit der angegebenen Verzeichnisstruktur:

~ / scripts / test / ~ / scripte / test / remote_loc /   ~ / scripts / test / remote_loc / site1 /   ~ / scripts / test / remote_loc / site1 / stopf1.txt   ~ / scripts / test / remote_loc / site2 /   ~ / scripts / test / remote_loc / site2 / stopf2.txt   ~ / scripts / test / remote_loc / site2 /   ~ / scripts / test / remote_loc / site3 / stopf3.txt

und benutze den Befehl:

ln -s /remote_loc/site1 test_link

Es erstellt einen symbolischen Link in Ihrem $ PWD oder dem aktuellen Arbeitsverzeichnis, das auf eine nicht vorhandene Datei außerhalb von / oder root unter / remote_loc / site1 verweist

Wenn sich Ihr PWD in ~ / scripts / befindet, sollten Sie Folgendes verwendet haben:

ln -s remote_loc/site1 test_link 

sonst hättest du den vollständigen absoluten Pfad wie folgt verwenden können:

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

Zweite Ausgabe:

Zitieren Sie:

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

Um Ihre Frage "Wer hat Recht" zu beantworten, bin ich mir nicht sicher, was genau Sie gelesen haben oder wie es verstanden wurde. Aber Folgendes sollte helfen aufzuräumen:

  1. Was kann aktualisiert werden, und
  2. Was kann nicht ohne Verwendung aktualisiert werden geeignete Schalter.


Symbolische Verknüpfungen mit Zielen aktualisieren, die keine Verzeichnisse sind.

ln -sf:
  Die Option -f oder --force entfernt vorhandene Zieldateien. Dies wird verwendet, um das Ziel oder Ziel eines Links zu aktualisieren.

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

Aber, wie Sie sehen können, wird es den absoluten Pfad geben, wenn absolute Pfade in sind lnArgumente. Es ist erforderlich, einen vollständigen Pfad anzugeben, wenn sich das aktuelle Arbeitsverzeichnis von dem übergeordneten Verzeichnis der Verknüpfung unterscheidet.


Relative Pfade:

ln -sfr:
  Die Option -r oder --relative erstellt symbolische Links relativ zum Speicherort der Verknüpfung.

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 können, trotz der Verwendung absoluter Pfadnamen in lnObiges Argument ohne die Option -r, die symbolische Verbindung ist immer noch relativ zu der Verbindung.


Verknüpfungen zu Verzeichnissen aktualisieren:

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 dazu:

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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



Wenn ich Tests mit einer Ebene des Verzeichnisses durchführe, funktioniert es, aber ich versuche, mehrstufige Verzeichnisse zu verwenden, und es funktioniert nicht. Ich habe meine Frage aktualisiert. - Jérôme Verstrynge