Question Comment copier des liens symboliques?


J'ai un répertoire qui contient des liens symboliques:

user@host:include$ find .. -type l -ls
4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat

Je dois les copier dans le répertoire en cours. Les liens résultants doivent être indépendants de leurs prototypes et conduire directement à leurs objets cibles.

  • cp -s crée des liens vers des liens dont le comportement n'est pas approprié.
  • cp -s -L refuse de copier des liens vers des répertoires
  • cp -s -L -r refuse de copier les liens relatifs vers un répertoire non fonctionnel

Que devrais-je faire?


147
2018-05-07 04:36


origine


cp -d fait le boulot de mon côté. - m-ric
cp -R sur un mac - Mirko


Réponses:


cp --preserve=links

De la page de manuel:

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

Personnellement, j'utilise cp -av  pour la plupart de mes copies lourdes. De cette façon, je peux tout préserver - même de manière récursive - et voir le résultat. Bien sûr, ce ne sont que des préférences personnelles.

Pour ce qui est de savoir pourquoi vos autres options n’ont pas fait ce que vous attendiez, -s fait un lien au lieu de copier et -L suit les liens dans la source pour trouver le fichier à copier au lieu de copier les liens eux-mêmes.


167
2018-05-07 05:02



Vous devrez peut-être ajouter -R, sinon cp sautera les répertoires et les liens symboliques vers les répertoires. - Olivier 'Ölbaum' Scherler
J'ai essayé ceci sur redhat et ça ne marche pas - Mansuro
sur un Mac? utilisation cp -a - Steve Tauber
+1 pour le -a option. Heh, j'ai cherché des options dans cpla page de manuel d'innombrables fois, mais j'ai toujours dû survoler celle-ci. J'ai jusqu'à présent utilisé -dpr, mais -a couvre tous ceux-ci, plus la préservation de quelques autres attributs. Si j'avais eu besoin de ces autres attributs, j'aurais probablement cherché le --preserve option à nouveau et utilisé -dr --preserve=all, qui est exactement ce que -a est! Eh bien au moins je sais maintenant - -a est parfait et c'est ce que je vais utiliser à partir de maintenant. - James Haigh
Cela n'a pas fonctionné sur Cygwin. --preserve=links n'était pas suffisant. Il a encore dit cp: omitting directory. Mais -av travaillé. - Chloe


Comme le dit la page de manuel, utilisez -P.


32
2018-05-07 04:39



sur Mac -P ne fonctionne pas sur les répertoires, donc j'ai utilisé cp -a - Steve Tauber
Merci, j'ai vu et bénéficié de votre réponse 3 fois maintenant, à différents moments sur un an. Ne peut pas sembler s'en souvenir! - Siddhartha
Cela fonctionne, mais ma page de manuel dit "-P ne suit jamais les liens symboliques dans SOURCE", ce qui n'est pas intuitivement le même que "copier des liens symboliques comme liens symboliques vers la destination". ("ne jamais suivre" donne l'impression que cela fonctionne en combinaison avec -R) - R.M.
Ce cp -P contrairement à la meilleure réponse votée par @kainosnous travaille pour moi. Merci! - tommy.carstensen
Fonctionne sur Redhat. La réponse acceptée ne fonctionne pas! - Phiber


Si les liens contiennent des chemins relatifs, la copie du lien ne modifie pas le chemin relatif. Utilisation readlink, avec l'interrupteur -f suivre récursivement, afin d'obtenir le chemin absolu du lien. Par exemple:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

Si préserver les chemins relatifs est ce que vous voulez, que l'option -P de cp, comme l’a dit Ignacio Vazquez-Abrams, c’est ce dont vous avez besoin.


26
2018-05-07 05:09



Cela peut être une mauvaise idée de déréférencer récursivement si tout ce que vous essayez de faire est de convertir les liens symboliques par rapport à l'absolu. La récursivité n'est pas nécessaire ici, et les liens symboliques parfois chaînés sont là pour une raison. Les liens symboliques sont souvent utilisés pour spécifier des choix ou des options de configuration. Par exemple, sur mon système, il existe une chaîne de liens symboliques /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english qui spécifie le dictionnaire préféré. Si vous deviez déréférencer récursivement cette chaîne, le lien symbolique résultant ignorerait toute modification future de cette préférence. - James Haigh


Comme quelques ont commenté:

cp -a 

fonctionne bien.

De l'homme:

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

16
2018-01-27 14:51



... mais seulement si aucun lien symbolique ne se trouve sur des chemins relatifs. - Michael Scheper


J'ai utilisé ce qui suit pour dupliquer un très grand répertoire. Tous les liens symboliques ont été conservés, la copie a été effectuée récursivement et j'ai pu avoir un retour visuel du processus:

cp -Prv /sourcer_dir/* /target_dir

9
2018-05-15 17:25





La plupart du temps, lorsque je dois copier de nombreux liens symboliques, j'essaie en fait de créer une arborescence de répertoires. Je veux donc les liens symboliques et tout le reste.

Cela est excessif pour copier quelques liens symboliques, mais si vous essayez de copier un arbre entier, cela peut être très utile:

Utilisation le goudron.

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

le goudron ne résout pas le lien symbolique par défaut, les liens symboliques dans la copie miroir vont donc pointer vers les mêmes emplacements que ceux de l'arborescence d'origine.

Cette astuce utilise des sous-couches pour obtenir le le goudron commande en position à la racine du répertoire à mettre en miroir; vous pouvez en laisser un (avec les CD commande) si vous êtes déjà dans le src ou dest répertoires:

# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

Encore une fois, ce n'est pas approprié pour chaque fois que vous souhaitez copier des liens symboliques, mais c'est un extrait très utile à connaître.


8
2018-05-07 06:03



le goudron est définitivement plus portable que cp dans mon expérience - don bright


Essayer: cp -pr destination de lien symbolique

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

OS - Centos 5 (Linux)


3
2017-07-27 13:15