Pregunta ¿Cómo copiar 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 son un comportamiento apropiado.
  • cp -s -L se niega a copiar enlaces a directorios
  • cp -s -L -r se niega a copiar enlaces relativos a un directorio que no funciona

¿Que debería hacer?


147


origen


cp -d hizo el trabajo de mi lado. - m-ric
cp -R en un mac - Mirko


Respuestas:


cp --preserve=links

Desde la página man:

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

Personalmente, yo uso cp -av  para la mayor parte de mi copia pesada. De esa manera, puedo preservar todo, incluso recursivamente, y ver la salida. Por supuesto, eso es solo preferencia personal.

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


167



Es posible que necesites agregar -R, porque de lo contrario, cp omitirá directorios y enlaces simbólicos a directorios. - Olivier 'Ölbaum' Scherler
Intenté esto con Redhat y no funciona - Mansuro
en una Mac? utilizar cp -a - Steve Tauber
+1 para el -a opción. Heh, he buscado opciones en cp's página de hombre en innumerables ocasiones, sin embargo, siempre he descuidado sobre este. Hasta ahora he estado usando -dpr, pero -a cubre todos esos, más la preservación de un par de otros atributos. Si hubiera necesitado estos otros atributos, probablemente habría buscado el --preserve opción de nuevo y usado -dr --preserve=all, que es exactamente lo que -a ¡es! Bueno, al menos ahora sé - -a es perfecto y esto es lo que usaré a partir de ahora. - James Haigh
Esto no funcionó en Cygwin. --preserve=links no fue suficiente Todavía dijo cp: omitting directory. Pero -av trabajó. - Chloe


Tal como dice la página del manual, use -P.


32



en Mac -P no funciona en los directorios, así que usé cp -a - Steve Tauber
Gracias, he visto y me he beneficiado de tu respuesta 3 veces diferentes veces durante un año. Parece que no puede recordarlo! - Siddhartha
Esto funciona, pero mi página man dice "-P nunca sigas enlaces simbólicos en SOURCE", que no es intuitivamente lo mismo que "copiar enlaces simbólicos como enlaces simbólicos al destino". ("nunca seguir" lo hace sonar como si funcionara en combinación con -R) - R.M.
Esta cp -P a diferencia de la respuesta más votado por @kainosnous, funciona para mí. ¡Gracias! - tommy.carstensen
Funciona en Redhat. ¡La respuesta aceptada no funciona! - Phiber


Si los enlaces contienen rutas relativas, entonces, al copiar el enlace no se ajustará la ruta relativa. Utilizar readlink, con el interruptor -f seguir de forma recursiva, para obtener la ruta absoluta del enlace. Por ejemplo:

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

Si preservar las rutas relativas es lo que desea, entonces la opción -P de cp, como dijo Ignacio Vazquez-Abrams, es lo que necesitas.


26



Puede ser una mala idea desreferencia recursiva si todo lo que intenta hacer es convertir los enlaces simbólicos de ser relativos a absolutos. La recursión no es necesaria aquí, y a veces los enlaces simbólicos encadenados están ahí por una razón. Los enlaces simbólicos a menudo se utilizan para especificar opciones o opciones de configuración. Por ejemplo, en mi sistema hay una cadena de enlaces simbólicos /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english que especifica el diccionario preferido. Si tuviera que desreferenciar recursivamente esta cadena, el enlace simbólico resultante ignoraría cualquier cambio futuro a esta preferencia. - James Haigh


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

16



... pero solo si ninguno de los enlaces simbólicos está en caminos relativos. - Michael Scheper


Usé lo siguiente para duplicar un directorio realmente grande. Se conservaron todos los enlaces simbólicos, la copia se realizó de forma recursiva y pude obtener algunos comentarios visuales del proceso:

cp -Prv /sourcer_dir/* /target_dir

9





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

Esto es excesivo para copiar solo unos cuantos enlaces simbólicos, pero si realmente está tratando de copiar un árbol completo, esto puede ser muy útil:

Utilizar alquitrán.

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

alquitrán no resuelve el enlace simbólico de forma predeterminada, por lo que los enlaces simbólicos en la copia duplicada apuntarán a las mismas ubicaciones que las del árbol original.

Este truco utiliza subcapas para obtener alquitrán comando en posición en la raíz del directorio a duplicar; puedes dejar uno afuera (junto con el asociado discos compactos comando) si ya estás en el src o dest directorios:

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

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


8



tar es definitivamente más portátil que cp en mi experiencia - don bright


Tratar: cp -pr destino de enlace simbólico

[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





En Ubuntu al copiar enlaces y archivos en un directorio:

cp --no-dereference --preserve=links

1



cp -d es la abreviatura de esto - hunse