46 votes

comment mettre à jour la cible d'un lien symbolique (ln -f -s ne fonctionne pas)

J'utilise

l /var/www/html/releases/build1390 app-current

pour mettre à jour le lien symbolique "app-current" avec une nouvelle destination. Cependant, cela ne fonctionne pas, le lien "app-current" garde sa destination d'origine, cependant, je n'obtiens aucune erreur...

Je préférerais ne pas supprimer le lien et le recréer, mais simplement mettre à jour la cible d'un lien existant. Est-ce possible ?

59voto

Kyle Brandt Points 81077

Cela fonctionne pour moi, quel est le résultat de strace ln -f -s /var/www/html/releases/build1390 app-current ?

Oh, puisqu'il s'agit d'un répertoire, vous devez ajouter -n pour l'absence de déréférence, ce qui devrait résoudre le problème. -f est plus une commodité puisque l'ajout de -f provoque de toute façon la suppression du lien. Bien que je suppose que cela se produirait probablement quelques centaines de ms plus rapidement sur un système normalement chargé.

Par exemple, si arf pointe déjà sur /home :

strace Avec -n :

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

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

Ainsi, sans la -n arf est déréférencé, donc ln le traite comme arf comme s'il était en fait / . Dans votre exemple particulier, s'il n'y a pas d'erreur, je pense que vous avez probablement créé un nouveau lien symbolique à l'intérieur de /var/www/html/releases/build1390 app-current et vous voudrez les nettoyer.

16voto

augurar Points 257

Vous pouvez utiliser -n o --no-dereference pour éviter que la cible ne soit déréférencée s'il s'agit d'un lien symbolique. Vous pouvez également utiliser -T o --no-target-directory pour s'assurer que le fichier cible sera toujours est traité comme un fichier normal.

Ceux-ci produisent un comportement légèrement différent, comme le montre l'exemple suivant. Supposons que src est un fichier quelconque, dirlink est un lien symbolique vers un répertoire, et dir est un répertoire réel.

Utilisation -n :

  • ln -sfn src dirlink écrase dirlink et le relie à src
  • ln -sfn src dir crée un lien dir/src -> src

Utilisation -T :

  • ln -sfT src dirlink écrase dirlink et le relie à src
  • ln -sfT src dir produit un message d'erreur : ln: ‘dir’: cannot overwrite directory

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X