Frage Wie man ein symbolisches Link-Ziel aktualisiert (ln -f -s funktioniert nicht)


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 das ursprüngliche Ziel bei, bekomme aber keine Fehler ...

Ich würde den Link lieber nicht entfernen und neu erstellen, sondern nur das Ziel eines bestehenden Links aktualisieren. Ist das möglich?


44
2018-06-03 11:32


Ursprung




Antworten:


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

Oh, da es ein Verzeichnis ist, das du hinzufügen musst -n für keine Dereferenzierung und das sollte das Problem lösen. -f ist wirklich mehr Bequemlichkeit, da das Hinzufügen von -f nur dazu führt, dass es sowieso auflöst. Obwohl es wahrscheinlich ein paar hundert ms schneller auf einem normal geladenen System 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 die -n ARF wird dereferenziert und behandelt es so, als ob es tatsächlich wäre /. In Ihrem speziellen Beispiel, wenn es keinen Fehler gibt, denke ich, dass Sie wahrscheinlich einen neuen symbolischen Link innerhalb von erstellt haben /var/www/html/releases/build1390 app-current und will das aufräumen.


54
2018-06-03 11:36



großartig, es ist das -n, das es getan hat. Danke vielmals! - solsol


Sie können verwenden -n oder --no-dereference um zu verhindern, dass das Ziel dereferenziert wird, wenn es sich um einen Symlink handelt. Sie können auch verwenden -T oder --no-target-directory um sicherzustellen, dass die Zieldatei wird immer als normale Datei behandelt werden.

Diese ergeben ein etwas anderes Verhalten, wie das folgende Beispiel zeigt. Annehmen src ist eine Datei, dirlink ist ein Symlink zu einem Verzeichnis, und dir ist ein aktuelles Verzeichnis.

Verwenden -n:

  • ln -sfn src dirlink überschreibt dirlink und verbindet es mit src
  • ln -sfn src dir erstellt Link dir/src -> src

Verwenden -T:

  • ln -sfT src dirlink überschreibt dirlink und verbindet es mit src
  • ln -sfT src dir erzeugt eine Fehlermeldung: ln: ‘dir’: cannot overwrite directory

12
2017-07-11 10:30



hat die korrekteste und prägnanteste Antwort für Linux-Benutzer. - ross
Gibt es eine Möglichkeit, das Zielverzeichnis zu überschreiben, damit Sie die Fehlermeldung nicht erhalten cannot overwrite directory? - gitaarik
@rednaw Sie können dies tun, indem Sie ein paar Befehle verketten, aber ln selbst entfernt Verzeichnisse nicht - das wäre wahrscheinlich eine schlechte Idee, weil es rekursiv eine möglicherweise große Anzahl von Dateien entfernen würde. - augurar