Comment écraser un lien symbolique d'un répertoire?

15

Il existe deux répertoires foo1et foo2.

Au début, je crée un répertoire de liens symboliques par ln -s foo1 bar. Après cela, je veux changer le lien symbolique, j'ai donc tapéln -sf foo2 bar

Mais barest toujours lié à foo1. Symlink foo2est créé à l'intérieur de foo1.

Que dois - je taper quand je veux remplacer foo1par foo2?

J'ai testé dans trois environnements.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (GNU coreutils) 8.4
  3. OS X 10.7.5, ln (sans version)
fer à repasser
la source

Réponses:

18

La bonne façon de procéder consiste à utiliser l' -n, --no-dereferenceoption comme ceci.

$ ln -snf foo2 bar

Cela provoque lnle traitement du lien symbolique existant comme un fichier. Sinon, il fait référence barà foo1, descend foo1et utilise le TARGETnom d' origine comme LINK_NAMEet c'est pourquoi vous vous retrouvez avec un lien symbolique à foo2créer dans le foo1répertoire. La page de manuel sur lnindique ce qui suit ...

-n, --no-dereference
       traiter LINK_NAME comme un fichier normal s'il s'agit d'un lien symbolique vers un
       annuaire

Ci-dessous est la sortie du shell sur mon bureau Arch Linux avec la version 8.21 lnavec et sans l' --no-dereferenceoption, j'ai obtenu les mêmes résultats que vous avez obtenus sans l' --no-dereferenceoption, mais en utilisant l' --no-dereferenceoption, cela a fonctionné comme prévu.

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
Drew Chapin
la source
Merci pour votre réponse. S'il s'agit d'un problème dépendant de l'environnement, j'écrirai mon environnement. Quel système d'exploitation utilisez-vous? quelles sorties ln --version?
ironsand
J'ai essayé cela sur une machine virtuelle Fedora 18 avec la version 8.17. Fait intéressant, j'ai essayé cela sur mon bureau Arch Linux avec la version 8.21 et j'ai obtenu les mêmes résultats que vous. On dirait que quelque part entre ces deux versions quelque chose a changé. Cependant, la solution que j'ai publiée a fonctionné dans les deux cas.
Drew Chapin,
Pour info, j'ai trouvé cette réponse sur les forums justlinux.com .
Drew Chapin
Merci druciferre! Je n'ai même jamais pensé que la lncommande était si souvent mise à niveau.
ironsand
J'ai aussi testé en osx. lnfonctionne de la même manière que ubuntu et centos avec le répertoire écraser et ln -snfrésoudre le problème. Même si ln -hc'est l'option préférée à utiliser dans osx.
ironsand