Question Comment remplacer / mettre à jour un lien symbolique?


J'essaie d'utiliser des liens symboliques. J'ai lu un peu et j'ai 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 les 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?

Mettre à jour

Voici la structure de mon répertoire:

~/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 cela semble cassé (contrairement à ce que j’ai dit plus haut dans ma question).

Comment puis-je effectuer un lien à plusieurs niveaux de répertoire?


150
2018-05-17 12:39


origine


Je recommande d'utiliser unlink au lieu de rm. Avec unlink vous ne risquez jamais de perdre des fichiers dans un répertoire source en utilisant accidentellement de mauvais commutateurs. - Jpsy
Vous utilisez un interligne / dans votre commande - Jamie Cook
@ jpsy vos conseils sur le déliement seraient très bien, si c'était vrai. Essayez de toucher zzzz; dissocier zzzz. (Dissocier les appels, dissocier de la même manière que rm, mais sans options fantaisistes et sans récursivité). - ctrl-alt-delor
Pourquoi utiliser de -n? (peut être le problème). Aussi, si votre ln prend en charge -t puis l'utiliser, pour ces cas, et -T ou destination/ pour les autres cas. - ctrl-alt-delor


Réponses:


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


124
2018-05-17 12:49



J'ai mis à jour ma question avec plus d'informations sur mon problème. - Jérôme Verstrynge
Je suis sous Linux. - Jérôme Verstrynge
Si vous changez le ln paramètres, comme je suis enclin à le faire, le -f commutateur détruire vos fichiers existants (cibles de lien)? Dans les deux cas, nous avons le -i paramètre (qui invitera l'utilisateur à écraser) également si vous voulez un peu de sécurité. - palswim
@palswim Cet article SO implique qu'il est sûr car -f juste des appels unlink() et link() sous la capuche: stackoverflow.com/a/1466570/157385. J'aimerais bien que je me souvienne du bon ordre! - Mike Branski
Ne marche pas. Besoins -n. Voir la réponse acceptée. - Shawn Welch


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

En d'autres termes, les commandes dans 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.


91
2018-05-17 13:32



Pour quelques informations supplémentaires sur la raison, les différences sont on est un relative chemin (sans le /) et l'autre est un absolute chemin (avec le /). Si vous administrez un système Linux, il est CRITIQUE de comprendre les différences. Par exemple, la différence entre rm -rf ./* et rm -rf /.* décide si tu gardes ton travail ou pas :) - Safado
Cela ne répond pas à la question 'comment mettre à jour / écraser un lien sym' - Sirch
La ligne ln -sfn {chemin / vers / nom-fichier} {nom-lien} le fait. - Jérôme Verstrynge
Quelle différence le -n option faire? - dokaspar
-n (--no-dereference) lui permet de traiter {nom du lien} comme un fichier normal plutôt que de suivre le lien. Étant donné que vous devez utiliser ce lien sans le suivre, vous devez utiliser cette option. - feldoh


Premier numéro:

En vous citant:

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

Le problème avec la structure de répertoire 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 que cela crée un lien symbolique dans votre répertoire $ PWD, ou présent, qui pointe vers un fichier non existant de la racine /, 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 numéro:

En vous citant:

J'ai lu ici et là qu'il n'est pas possible de mettre à jour / annuler   un lien symbolique. Il y a donc des informations contradictoires sur le net. Qui est   droite? 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 ou comment cela a été compris. Mais, ce qui suit devrait aider à éclaircir:

  1. Que peut-on mettre à jour, et
  2. Que ne peut pas être mis à jour sans utiliser interrupteurs appropriés.


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

En -sf:
  Le -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, cela donnera le chemin absolu si les chemins absolus sont en lnLes arguments de. 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:

En -sfr:
  Le -r ou --relative 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

Toutefois, 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 constater, malgré l’utilisation de noms de chemins absolus donnés dans lnL'argument ci-dessus sans l'option -r, le lien symbolique est toujours relatif au lien.


Mettre à jour les liens vers les répertoires:

En -sfrn:
  Le -n ou --no-dereference traite LINK_NAME en tant que 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

Par opposition à:

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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



Lorsque j'effectue des tests avec 1 niveau de répertoire, cela fonctionne, mais j'essaie d'utiliser des répertoires à plusieurs niveaux et cela ne fonctionne pas. J'ai mis à jour ma question. - Jérôme Verstrynge