Vraag hoe een symbolisch linkdoel te updaten (ln -f -s werkt niet)


ik gebruik

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

om symbolische link "app-current" bij te werken met een nieuwe bestemming. Dit werkt echter niet, de link "app-current" behoudt de oorspronkelijke bestemming, maar ik krijg geen fouten ...

Ik wil de link liever niet verwijderen en opnieuw maken, maar werk het doel van een bestaande link bij. Is dat mogelijk?


44
2018-06-03 11:32


oorsprong




antwoorden:


Dat werkt voor mij, wat is de output van strace ln -f -s /var/www/html/releases/build1390 app-current ?

Oh, want het is een map die je moet toevoegen -n voor geen dereference en dit zou het probleem moeten oplossen. -f is echt meer een gemak, omdat het toevoegen van de -f ervoor zorgt dat het sowieso ontkoppelt. Hoewel ik vermoed dat het waarschijnlijk een paar honderd ms sneller gaat op een normaal geladen systeem.

Als arf bijvoorbeeld al naar / home verwijst:

strace met -n:

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

strace Zonder -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

Dus zonder de -n arf krijgt een dereferentie, dus het behandelt het alsof het in werkelijkheid is /. In jouw specifieke voorbeeld, als er geen fout is, denk ik dat je waarschijnlijk een nieuwe symbolische link hebt gemaakt binnenin /var/www/html/releases/build1390 app-current en wil dat opruimen.


54
2018-06-03 11:36



geweldig, het is het -n dat deed het. Hartelijk bedankt! - solsol


Je kunt gebruiken -n of --no-dereference om te voorkomen dat het doelwit dereferent wordt als het een symlink is. Je kan ook gebruiken -T of --no-target-directory om ervoor te zorgen dat het doelbestand zal altijd worden behandeld als een normaal bestand.

Deze produceren een iets ander gedrag, zoals in het volgende voorbeeld wordt weergegeven. Veronderstellen src is een bestand, dirlink is een symlink naar een map, en dir is een echte map.

Gebruik makend van -n:

  • ln -sfn src dirlink overschrijven dirlink en koppelt het aan src
  • ln -sfn src dir maakt een link dir/src -> src

Gebruik makend van -T:

  • ln -sfT src dirlink overschrijven dirlink en koppelt het aan src
  • ln -sfT src dir produceert een foutmelding: ln: ‘dir’: cannot overwrite directory

12
2017-07-11 10:30



heeft het meest correcte en beknopte antwoord voor Linux-gebruikers. - ross
Is er een manier om het overschrijven van de doeldirectory te forceren, zodat u het foutbericht niet krijgt cannot overwrite directory? - gitaarik
@rednaw Je kunt dit doen door een paar commando's te ketenen, maar ln zelf verwijdert geen mappen - dit zou waarschijnlijk een slecht idee zijn, omdat het een recursief verwijderen van een mogelijk enorm aantal bestanden zou vereisen. - augurar