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?

Solsol
quelle

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.

Kyle Brandt
quelle
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
augurar
quelle
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