Ich benutze
ln -f -s /var/www/html/releases/build1390 app-aktuell
um den symbolischen Link „app-current“ mit einem neuen Ziel zu aktualisieren. Dies funktioniert jedoch nicht, der Link „app-current“ behält sein ursprüngliches Ziel, ich erhalte jedoch keine Fehler ...
Ich möchte den Link lieber nicht entfernen und neu erstellen, sondern nur das Ziel eines vorhandenen Links aktualisieren. Ist das möglich?
Antwort1
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 hinzufügen müssen, -n
um keine Dereferenzierung zu erhalten, sollte dies das Problem lösen. -f
ist eigentlich eher praktisch, da das Hinzufügen von -f ohnehin dazu führt, dass die Verknüpfung aufgehoben wird. Obwohl ich vermute, dass es auf einem normal ausgelasteten System wahrscheinlich ein paar hundert ms schneller passieren würde.
Wenn arf beispielsweise 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
Ohne -n
wird also arf dereferenziert, sodass ln es als arf behandelt, als wäre es tatsächlich /
. Wenn in Ihrem speziellen Beispiel kein Fehler vorliegt, haben Sie wahrscheinlich einen neuen symbolischen Link darin erstellt /var/www/html/releases/build1390 app-current
und möchten diesen bereinigen.
Antwort2
Sie können -n
oder verwenden --no-dereference
, um zu verhindern, dass das Ziel dereferenziert wird, wenn es sich um einen symbolischen Link handelt. Sie können auch -T
oder verwenden --no-target-directory
, um sicherzustellen, dass die Zieldateistetswie eine normale Datei behandelt werden.
Diese erzeugen ein leicht unterschiedliches Verhalten, wie das folgende Beispiel zeigt. Angenommen, es handelt src
sich um eine Datei, dirlink
einen symbolischen Link zu einem Verzeichnis und dir
ein tatsächliches Verzeichnis.
Verwendung von -n
:
ln -sfn src dirlink
überschreibtdirlink
und verknüpft es mitsrc
ln -sfn src dir
Link erstellendir/src -> src
Verwendung von -T
:
ln -sfT src dirlink
überschreibtdirlink
und verknüpft es mitsrc
ln -sfT src dir
erzeugt eine Fehlermeldung:ln: ‘dir’: cannot overwrite directory