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 à leurs 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 vraiment volumineux. Tous les liens symboliques ont été préservés, la copie a été faite de manière récursive et j'ai pu avoir un retour visuel du processus :

cp -Prv /sourcer_dir/* /target_dir

4voto

ebe0 Points 41

Essayez : cp -pr lien symbolique 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 mentionné 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, donc j'ai posté une réponse séparée.)

3voto

Greg Points 307

Sous Ubuntu lors de la copie de liens et de fichiers dans un répertoire:

cp --no-dereference --preserve=liens

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 déréférencement 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 il suffit de copier sans déréférencement, en utilisant l'option cp -P. Je crois que c'est aussi la valeur par défaut pour cp.

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

Consultez 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