Est-il un moyen de modifier un lien symbolique sans supprimer d'abord? [dupliquer]

cette question a déjà une réponse ici:

  • pouvez-vous changer ce qu'un lien symbolique indique après sa création? 7 réponses

donc j'ai créé un lien symbolique:

ln -s /location/to/link linkname

maintenant je veux changer l'emplacement auquel le lien symbolique se lie. Comment dois-je faire? être il y a un moyen de le faire sans supprimer d'abord?

53
demandé sur Andrew 2009-11-13 08:22:00

10 réponses

Vous pouvez créer le nouveau lien avec un nom différent, puis déplacez-le pour remplacer l'ancien lien.

ln -s /location/to/link linkname

plus tard

ln -s /location/to/link2 newlink
mv newlink linkname

si newlink et linkname sont sur le même dispositif physique le mv devrait être atomique.

34
répondu martin clayton 2009-11-13 07:01:03

Essayer ln -sf new_destination linkname .

22
répondu Phil 2009-11-13 05:33:46

si les cibles du lien symbolique sont des répertoires, vous devez ajouter le drapeau -T à la commande mv , sinon il déplace le nouveau lien symbolique dans le répertoire cible de l'ancien lien symbolique.

exemple de changement atomique d'un site web vers une nouvelle version:

setup Original-site web est stocké dans www1 répertoire, vhost pointant sur www symlink:

ln -s www1 www

naviguer sur le site web, Voir Vieux version.

mettre de nouveaux fichiers de site Web dans le nouveau www2 répertoire.

crée un nouveau lien symbolique vers un nouveau site web:

ln -s www_new www2

Déplacer www lien symbolique vers le répertoire du nouveau site internet:

mv -T www_new www

consulter le site web, voir la nouvelle version immédiatement.

16
répondu ben_nuttall 2013-03-26 17:44:00

il suffit de changer la cible symlink:

# ln -sfT /path/to/new/target linkname

c'est un changement atomique instantané.

9
répondu Jake Wilson 2015-02-18 05:08:34

Pour les répertoires, vous voulez faire: ln -sfT /emplacement/de/new/cible old_linkname

7
répondu raa 2014-04-02 21:48:04

sur OSX, la page de manuel de ln dit qu'on peut le faire comme ça.

ln -shf /location/to/link link name

de la page de manuel:

The options are as follows:
 -F    If the target file already exists and is a directory, then remove it so that the link may occur.  The -F
       option should be used with either -f or -i options.  If none is specified, -f is implied.  The -F option is
       a no-op unless -s option is specified.

 -h    If the target_file or target_dir is a symbolic link, do not follow it.  This is most useful with the -f
       option, to replace a symlink which may point to a directory.

 -f    If the target file already exists, then unlink it so that the link may occur.  (The -f option overrides any
       previous -i options.)

 -i    Cause ln to write a prompt to standard error if the target file exists.  If the response from the standard
       input begins with the character `y' or `Y', then unlink the target file so that the link may occur.  Other-
       wise, do not attempt the link.  (The -i option overrides any previous -f options.)

 -n    Same as -h, for compatibility with other ln implementations.

 -s    Create a symbolic link.

 -v    Cause ln to be verbose, showing files as they are processed.
6
répondu jschank 2014-02-17 21:30:05

Pas de. L'appel système symlink retournera EEXIST si newpath existe déjà. Vous ne pouvez lier qu'à partir d'un nouveau noeud dans le système de fichiers. Quelle est la condition ici? Si vous êtes inquiet au sujet d'une course en raison de la non-atomicité des appels unlink/symlink, alors vous pourriez vouloir repenser l'architecture un peu pour fournir la synchronisation ailleurs. Il y a eu des bogues de sécurité effrayants introduits par ce genre de chose.

5
répondu Andy Ross 2009-11-13 05:33:19

enchaîner les commandes comme ceci:

rm currentlink && ln -s /path/to/link currentlink

la première commande supprime la commande existante et la seconde la crée immédiatement à nouveau.

4
répondu Pete 2013-02-26 09:20:10

comme d'autres l'ont mentionné, vous devez d'abord supprimer le lien symbolique, soit manuellement, soit en passant le drapeau -f à l'utilitaire ln .

il y a des années, j'ai dû faire de petites modifications aux liens symboliques assez fréquemment, donc j'ai écrit un utilitaire simple basé sur la lecture en ligne ( edln ) pour rendre cela moins ennuyeux. Au cas où quelqu'un d'autre le trouve utile, je l'ai mis en ligne à https://github.com/jjlin/edln / .

edln affichera la cible symlink originale; vous pouvez alors utiliser les touches fléchées, ou les touches de lecture standard( M-b , M-f , C-d , etc.) pour vous déplacer et modifier la cible.

3
répondu jjlin 2012-05-07 00:46:10

juste googlé, n'a trouvé aucune bonne réponse et a dû me résoudre moi-même:

ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary

éditer par définition signifie Ne pas recréer à partir de zéro mais changer en partie. Toute réponse exigeant de mémoriser un chemin, peut-être long ou avec des symboles bizarres, est certainement mauvais.

0
répondu user1046885 2014-08-29 11:32:38