web-dev-qa-db-fra.com

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

Il y a deux répertoires foo1 et foo2.

Au début, je fais un répertoire liMLink par ln -s foo1 bar. Après cela, je veux changer le symbolique, donc j'ai tapé ln -sf foo2 bar

Mais bar est toujours lié à foo1. Symlink foo2 est créé à l'intérieur de foo1.

Que dois-je taper quand je veux remplacer foo1 par foo2?

J'ai testé dans trois environnements.

  1. Ubuntu 12.04, ln (gnu cortitils) 8.13
  2. Centos 6.4, ln (GNU Coreutils) 8.4
  3. OS X 10.7.5, ln (sans version)
15
ironsand

La bonne façon de le faire est d'utiliser le -n, --no-dereference option comme si oui.

$ ln -snf foo2 bar

Cette cause ln pour traiter le symboliste existant en tant que fichier. Sinon, il déréférences bar à foo1, descend dans foo1 et utilise l'original TARGET nom comme le LINK_NAME Et c'est pourquoi vous vous retrouvez avec un lien symbolique à foo2 être créé à l'intérieur de l'foo1 répertoire. Le manoir sur ln stipule ce qui suit ...

[.____] - N, -NO-Drérerence 
 Traitez Link_Name comme un fichier normal s'il s'agit d'un lien symbolique à un 
 Répertoire [.____]

Vous trouverez ci-dessous la sortie de shell sur mon ordinateur de bureau d'Arch Linux avec la version 8.21 de ln avec et sans le --no-dereference Option, j'ai reçu les mêmes résultats que vous avez fait sans le --no-dereference option, mais en utilisant le --no-dereference Option qu'il 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
18
Drew Chapin