So aktualisieren Sie ein symbolisches Link-Ziel (ln -f -s funktioniert nicht)


45

Ich benutze

ln -f -s / var / www / html / releases / build1390 app-current

um den symbolischen Link "app-current" mit einem neuen Ziel zu aktualisieren. Dies funktioniert jedoch nicht, der Link "app-current" behält das ursprüngliche Ziel bei, es werden jedoch keine Fehler angezeigt ...

Ich möchte den Link lieber nicht entfernen und neu erstellen, sondern nur das Ziel eines vorhandenen Links aktualisieren. Ist das möglich?

Antworten:


55

Das funktioniert für mich, was ist die Ausgabe von strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, da es sich um ein Verzeichnis handelt, das Sie -nohne Dereferenzierung hinzufügen müssen, sollte dies das Problem lösen. -fist wirklich bequemer, da das Hinzufügen von -f die Verknüpfung sowieso aufhebt. Obwohl ich denke, dass es auf einem normal geladenen System wahrscheinlich einige hundert ms schneller passieren würde.

Zum Beispiel, wenn arf bereits auf / home zeigt:

strace mit -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Ohne -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Also, ohne dass der -nArf dereferenziert wird, wird er als Arf behandelt, als ob er tatsächlich wäre /. Wenn in Ihrem speziellen Beispiel kein Fehler vorliegt, haben Sie wahrscheinlich einen neuen symbolischen Link innerhalb von erstellt /var/www/html/releases/build1390 app-currentund möchten diesen bereinigen.


4
toll, es ist das -n, das es geschafft hat. Danke vielmals!
Solsol

12

Sie können mit -noder --no-dereferenceverhindern, dass das Ziel dereferenziert wird, wenn es sich um einen Symlink handelt. Sie können auch -Toder verwenden, --no-target-directoryum sicherzustellen, dass die Zieldatei immer als reguläre Datei behandelt wird.

Diese erzeugen ein etwas anderes Verhalten, wie das folgende Beispiel zeigt. Angenommen, es srchandelt sich um eine Datei, dirlinkeinen Symlink zu einem Verzeichnis und direin tatsächliches Verzeichnis.

Verwenden von -n:

  • ln -sfn src dirlinküberschreibt dirlinkund verknüpft es mitsrc
  • ln -sfn src dir schafft Verbindung dir/src -> src

Verwenden von -T:

  • ln -sfT src dirlinküberschreibt dirlinkund verknüpft es mitsrc
  • ln -sfT src dir erzeugt eine Fehlermeldung: ln: ‘dir’: cannot overwrite directory

1
hat die richtige und prägnante Antwort für Linux-Benutzer.
Ross

Gibt es eine Möglichkeit, das Überschreiben des Zielverzeichnisses zu erzwingen, sodass die Fehlermeldung nicht angezeigt wird cannot overwrite directory?
Gitaarik

@rednaw Sie können dies tun, indem Sie einige Befehle verketten, aber lnselbst keine Verzeichnisse entfernen - dies wäre wahrscheinlich eine schlechte Idee, da es rekursiv erforderlich wäre, eine möglicherweise große Anzahl von Dateien zu entfernen.
August
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.