comment mettre à jour une cible de lien symbolique (ln -f -s ne fonctionne pas)

45

j'utilise

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

mettre à jour le lien symbolique "app-current" avec une nouvelle destination. Cependant, cela ne fonctionne pas, le lien "app-current" conserve sa destination d'origine, cependant, je ne reçois aucune erreur ...

Je préfère ne pas supprimer le lien et le recréer, il suffit de mettre à jour la cible d'un lien existant. Est-ce possible?

solsol
la source

Réponses:

55

Cela fonctionne pour moi, quelle est la sortie de strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, puisque c’est un répertoire que vous devez ajouter -nsans déréférence, cela devrait résoudre le problème. -fest vraiment plus pratique puisque l’ajout de -f le dissocie de toute façon. 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à vers / 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

Donc, sans que l' -narf soit déréférencé, il est traité comme si c'était en réalité /. 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-currentet que vous voudrez nettoyer cela.

Kyle Brandt
la source
4
super, c'est le -n qui l'a fait. Merci beaucoup!
solsol
12

Vous pouvez utiliser -nou --no-dereferencepour empêcher le déréférencement de la cible s'il s'agit d'un lien symbolique. Vous pouvez également utiliser -Tou --no-target-directorypour vous assurer que le fichier cible sera toujours traité comme un fichier normal.

Celles-ci produisent un comportement légèrement différent, comme le montre l'exemple suivant. Supposons qu'il y srcait un fichier, dirlinkun lien symbolique vers un répertoire et dirun répertoire réel.

Utilisant -n:

  • ln -sfn src dirlinkécrase dirlinket lie àsrc
  • ln -sfn src dir crée un lien dir/src -> src

Utilisant -T:

  • ln -sfT src dirlinkécrase dirlinket lie àsrc
  • ln -sfT src dir produit un message d'erreur: ln: ‘dir’: cannot overwrite directory
augurar
la source
1
a la réponse la plus correcte et succincte pour les utilisateurs de Linux.
Ross
Existe-t-il un moyen de forcer l’écrasement du répertoire cible pour ne pas recevoir le message d’erreur cannot overwrite directory?
jeudi
@rednaw Vous pouvez le faire en chaînant quelques commandes, mais lnne supprime pas les répertoires. Ce serait probablement une mauvaise idée, car cela exigerait la suppression récursive d'un nombre potentiellement énorme de fichiers.
augurar