216 votes

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 actuel. Les liens résultants doivent être indépendants de leurs prototypes et mener directement aux objets cibles.

  • cp -s crée des liens vers des liens, ce qui n'est pas un comportement approprié.
  • cp -s -L refuse de copier des liens vers des répertoires
  • cp -s -L -r refuse de copier des liens relatifs vers des répertoires non fonctionnels

Que dois-je faire ?

11voto

oarevalo Points 211

J'ai utilisé ce qui suit pour dupliquer un répertoire très volumineux. Tous les liens symboliques ont été préservés, la copie a été effectuée de manière récursive et j'ai pu avoir un retour visuel sur le processus :

cp -Prv /sourcer_dir/* /target_dir

4voto

ebe0 Points 41

Essayez : cp -pr lien_symbole destination

[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]# 

Système d'exploitation - Centos 5 (Linux)

4voto

1234ru Points 201

Utilisez l'option -P, comme l'a écrit Ignacio Vazquez-Abrams ci-dessus. Ce qu'il n'a pas mentionné, c'est que -P n'a aucun effet sans -R. Vous avez donc besoin d'au moins cp -RP.

(Le site ne me permet pas encore de commenter, j'ai donc posté une réponse séparée.)

3voto

Greg Points 307

Lors de la copie de liens et de fichiers dans un répertoire sous Ubuntu:

cp --no-dereference --preserve=links

1voto

Atif Hussain Points 111

Cp -s et cp -L sont des commandes spéciales. Pour votre besoin, n'utilisez aucune.

par exemple Copier un répertoire DIR contenant a et un lien symbolique b pointant vers a.

  • cp -s DIR/* N/ crée un lien symbolique au lieu de copier, N/a->../DIR/a (lien) et N/b->(../DIR/b) qui est un lien vers un lien
  • cp -L DIR/* N/ copie avec résolution des liens, N/a, N/b (identique à DIR/a)

Ce dont vous avez besoin est N/a(=DIR/a), et N/b->../N/a; donc copiez simplement sans résoudre les liens, en utilisant l'option cp -P. Je crois que c'est également la valeur par défaut pour cp.

  • -P pas de résolution, préserver les liens
  • -d combine l'option -P avec -p pour préserver = mode, propriété, horodatages
  • -a combine l'option -d avec -R pour copier récursivement des répertoires

voir man cp ou cp --help pour plus d'options.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X