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?
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.
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?
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
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:
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
$ 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