web-dev-qa-db-fra.com

Comment remplacer / mettre à jour un lien symbolique?

J'essaie d'utiliser des liens symboliques. J'ai fait quelques lectures et trouvé les commandes suivantes:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Les créations et suppressions fonctionnent bien. Mais les mises à jour ne fonctionnent pas. Après avoir exécuté cette commande, le lien symbolique devient invalide.

J'ai lu ici et là qu'il n'est pas possible de mettre à jour/remplacer un lien symbolique. Il y a donc des informations contradictoires sur le net. Qui a raison? Si un lien symbolique peut être mis à jour/remplacé, comment puis-je y parvenir?

Mise à jour

Voici ma structure de répertoires:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

De ~/scripts/test/, quand je joue:

ln -s /remote_loc/site1 test_link

une test_link est créé et je peux ls -l mais il semble cassé (contrairement à ce que j'ai dit plus haut dans ma question).

Comment puis-je effectuer un lien au niveau de plusieurs répertoires?

200

Ok, j'ai trouvé où est mon erreur: il ne faut pas mettre le premier / dans le chemin.

En d'autres termes, les commandes de mes questions devraient être:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

au lieu de

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

compte tenu de mon cas.

130

En utilisant -f avec ln écrasera tout lien qui était déjà là, donc tant que vous avez les bonnes autorisations, cela devrait fonctionner ... Cela a toujours fonctionné pour moi. Quel système d'exploitation utilisez-vous?

163
Sirch

Premier numéro:

Vous citer:

Les créations et suppressions fonctionnent bien. Mais les mises à jour ne fonctionnent pas. Après avoir exécuté cette commande, le lien symbolique devient invalide.

Le problème Avec la structure de répertoires donnée:

~/scripts/test/~/scripts/test/remote_loc/~/scripts/test/remote_loc/site1/~/scripts/test/remote_loc/site1/stuff1.txt ~/scripts/test/remote_loc/site2/~/scripts /test/remote_loc/site2/stuff2.txt ~/scripts/test/remote_loc/site2/~/scripts/test/remote_loc/site3/stuff3.txt

et en utilisant la commande:

ln -s /remote_loc/site1 test_link

Est-ce qu'il crée un lien symbolique dans votre $ PWD, ou répertoire de travail actuel, qui pointe vers un fichier non existant à partir du /, ou racine, dans/remote_loc/site1

Si votre PWD est dans ~/scripts/alors vous devriez avoir utilisé ceci:

ln -s remote_loc/site1 test_link

sinon vous auriez pu utiliser le chemin absolu complet comme:

ln -s /home/yourusername/remote_loc/site1 test_link

Deuxième problème:

Vous citer:

J'ai lu ici et là qu'il n'est pas possible de mettre à jour/remplacer un lien symbolique. Il y a donc des informations contradictoires sur le net. Qui a raison? Si un lien symbolique peut être mis à jour/remplacé, comment puis-je y parvenir?

Pour répondre à votre question "Qui a raison", je ne sais pas exactement ce que vous avez lu, ni comment cela a été compris. Mais, ce qui suit devrait aider à clarifier:

  1. Ce qui peut être mis à jour, et
  2. Ce qui ne peut pas être mis à jour sans utiliser les commutateurs appropriés.


Mise à jour des liens symboliques avec des cibles qui ne sont pas des répertoires.

ln -sf:
L'option -f ou --force supprime les fichiers de destination existants. Ceci est utilisé pour mettre à jour la cible ou la destination d'un lien.

Exemple:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Mais, comme vous pouvez le voir, il donnera le chemin absolu si les chemins absolus sont dans les arguments de ln. Donner un chemin complet est nécessaire lorsque le répertoire de travail actuel est différent du répertoire parent du lien.


Chemins relatifs:

ln -sfr:
La relation -r ou - crée des liens symboliques relatifs à l'emplacement du lien.

Exemple:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Mais, la mise à jour d'un lien vers un répertoire ne fonctionnera pas si la cible est un répertoire.

Exemple:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Comme vous pouvez le voir, malgré l'utilisation de noms de chemin absolus donnés dans l'argument de ln ci-dessus sans l'option -r, le lien symbolique est toujours relatif au lien.


Mettre à jour les liens vers les répertoires:

ln -sfrn:
La référence -n ou --no-dereference traite LINK_NAME comme un fichier normal s'il s'agit d'un lien symbolique vers un répertoire.

Exemple:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

En contraste avec:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir
13
Keith Reynolds
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
7
jirib