2010-05-07 04:36:38 +0000 2010-05-07 04:36:38 +0000
188
188

¿Cómo copiar los enlaces simbólicos?

Tengo un directorio que contiene algunos enlaces simbólicos:

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

Necesito copiarlos al directorio actual. Los enlaces resultantes deben ser independientes de sus prototipos y conducir directamente a sus objetos de destino.

  • cp -s crea enlaces a enlaces que no es un comportamiento apropiado.
  • cp -s -L se niega a copiar enlaces a directorios
  • cp -s -L -r se niega a copiar enlaces relativos a directorios que no funcionan

¿Qué debo hacer?

Respuestas (10)

212
212
212
2010-05-07 05:02:45 +0000

Personalmente, uso cp -av para la mayoría de mis copias pesadas. De esa manera, puedo preservar todo, incluso de forma recursiva, y ver el resultado. Por supuesto, eso es sólo una preferencia personal.

En cuanto a por qué sus otras opciones no hicieron lo que usted esperaba, -s hace un enlace en lugar de copiar y -L sigue los enlaces en la fuente para encontrar el archivo a copiar en lugar de copiar los enlaces mismos.

47
47
47
2010-05-07 04:39:24 +0000

Como dice la página del hombre, usa -P.

30
30
30
2010-05-07 05:09:01 +0000

Si los enlaces contienen caminos relativos, entonces, al copiar el enlace no se ajustará el camino relativo. Utiliza readlink, con el interruptor -f para seguir de forma recursiva, para obtener la ruta absoluta del enlace. Por ejemplo:

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

Si lo que se quiere es conservar los caminos relativos, entonces la opción -P de cp, como dice Ignacio Vázquez-Abrams, es lo que se necesita.

24
24
24
2015-01-27 14:51:13 +0000

Como algunos han comentado:

cp -a

funciona bien.

Del hombre:

-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
11
11
11
2012-05-15 17:25:32 +0000

Utilicé lo siguiente para duplicar un directorio muy grande. Todos los enlaces simbólicos fueron preservados, la copia se hizo recursivamente y pude tener alguna retroalimentación visual del proceso:

cp -Prv /sourcer_dir/* /target_dir
11
11
11
2010-05-07 06:03:32 +0000

La mayoría de las veces, cuando necesito copiar muchos enlaces simbólicos, estoy tratando de reflejar un árbol de directorios. Así que quiero los enlaces simbólicos y todo lo demás.

Esto es exagerado para copiar sólo unos pocos enlaces simbólicos, pero si realmente estás tratando de copiar un árbol entero, esto puede ser muy útil:

Usar tar.

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

tar no resuelve el enlace simbólico por defecto, por lo que los enlaces simbólicos en la copia espejo apuntarán a los mismos lugares que los del árbol original.

Este truco hace uso de subcarpetas para poner el comando tar en posición en la raíz del directorio a replicar; puedes dejar una de ellas fuera (junto con el comando cd asociado) si ya estás en los directorios src o dest:

# 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 - )'

De nuevo, esto no es apropiado para cada vez que quieras copiar enlaces simbólicos, pero es un fragmento muy útil para saber.

4
4
4
2011-07-27 13:15:51 +0000

Prueba: cp -pr symlink 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]#

OS - Centos 5 (Linux)

3
3
3
2015-12-01 12:51:43 +0000

En Ubuntu cuando se copian enlaces y archivos en un directorio:

cp --no-dereference --preserve=links
2
2
2
2019-01-12 17:55:13 +0000

Use la opción -P, como Ignacio Vázquez-Abrams escribió arriba . Lo que no mencionó es que -P no tiene efecto sin -R. Así que necesitas al menos cp -RP.

(El sitio no me deja comentar todavía así que he publicado una respuesta por separado.)

1
1
1
2018-06-26 03:24:57 +0000

cp -s y cp -L son comandos especiales. Para su requerimiento, use ninguno.

e.g. Copiar un directorio DIR que contenga a y un enlace simbólico b apuntando a a.

  • cp -s DIR/* N/ crea un enlace simbólico en lugar de copiar, N/a->../DIR/a (enlace) y N/b->(. ./DIR/b) que es un enlace a un enlace
  • cp -L DIR/* N/ copia con dereferenciación de enlace, N/a, N/b (igual que DIR/a)

Lo que necesita es N/a(=DIR/a), y N/b->../N/a; así que copie sin dereferenciación, usando la opción cp -P. Creo que esta es también la opción por defecto para cp.

  • -P sin derivación, preservar los enlaces
  • -d combina la opción -P con -p para preservar=modo,propiedad,marcas de tiempo
  • -a combina la opción -d con -R para copiar recursivamente los directorios

referirse a man cp o cp --help para más opciones.

Preguntas relacionadas

6
10
7
5
11