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 en el directorio actual. Los enlaces resultantes deben ser independientes de sus prototipos y conducir directamente a sus objetos objetivo.
cp -s
crea enlaces a enlaces que no es un comportamiento apropiado.cp -s -L
se niega a copiar enlaces a directorioscp -s -L -r
se niega a copiar enlaces relativos a un directorio que no funciona
¿Qué tengo que hacer?
linux
command-line
symbolic-link
cp
Basilevs
fuente
fuente
cp -d
hizo el trabajo de mi lado.cp -R
en un macRespuestas:
Desde la página del manual:
Personalmente, uso
cp -av
para la mayoría de mis copias pesadas. De esa manera, puedo preservar todo, incluso recursivamente, y ver el resultado. Por supuesto, eso es solo preferencia personal.En cuanto a por qué sus otras opciones no hicieron lo que esperaba,
-s
crea 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.fuente
-R
, porque de lo contrario, cp omitirá directorios y enlaces simbólicos a directorios.cp -a
-a
opción. Heh, he buscado opciones encp
la página de manual de innumerables veces, sin embargo, siempre he pasado por alto esta. Hasta ahora he estado usando-dpr
, pero-a
cubre todos esos, además de la preservación de un par de otros atributos. Si hubiera necesitado estos otros atributos, probablemente habría buscado la--preserve
opción nuevamente y la hubiera usado-dr --preserve=all
, ¡que es exactamente lo que-a
es! Bueno, al menos ahora lo sé,-a
es perfecto y esto es lo que usaré de ahora en adelante.--preserve=links
no fue suficiente Todavía lo decíacp: omitting directory
. Pero-av
funcionó.Del mismo modo que la página del manual dice, utilice
-P
.fuente
-P
no funciona en directorios, así que usécp -a
cp -P
diferencia de la respuesta más votada por @kainosnous, funciona para mí. ¡Gracias!Si los enlaces contienen rutas relativas, entonces, copiar el enlace no ajustará la ruta relativa. Use
readlink
, con el interruptor-f
para seguir recursivamente, para obtener la ruta absoluta del enlace. Por ejemplo:Si lo que desea es preservar los caminos relativos, entonces la opción
-P
decp
, como dijo Ignacio Vázquez-Abrams, es lo que necesita.fuente
/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english
que especifica el diccionario preferido. Si desreferenciara recursivamente esta cadena, el enlace simbólico resultante ignoraría cualquier cambio futuro a esta preferencia.Como algunos han comentado:
funciona bien.
Del hombre:
fuente
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 tener algunos comentarios visuales del proceso:
fuente
La mayoría de las veces, cuando necesito copiar muchos enlaces simbólicos, en realidad estoy tratando de reflejar un árbol de directorios. Así que quiero los enlaces simbólicos y todo lo demás.
Esto es excesivo para copiar solo algunos enlaces simbólicos, pero si realmente está intentando copiar un árbol completo, esto puede ser muy útil:
Usa alquitrán .
tar no resuelve el enlace simbólico de manera predeterminada, por lo que los enlaces simbólicos en la copia espejo apuntarán a las mismas ubicaciones que las del árbol original.
Este truco utiliza subcapas para colocar el comando tar en la raíz del directorio que se va a duplicar; puede dejar uno de ellos (junto con el comando cd asociado ) si ya está en los directorios src o dest :
Nuevamente, esto no es apropiado para cada vez que desee copiar enlaces simbólicos, pero es un fragmento muy útil para saber.
fuente
Prueba: cp -pr symlink destination
SO: Centos 5 (Linux)
fuente
En Ubuntu al copiar enlaces y archivos en un directorio:
fuente
cp -d
es la abreviatura de estocp -a
ycp --preserve=links
hago más de lo que la pregunta está haciendo. Según tengo entendido, esta es la respuesta correcta para cualquiera que usecp
, aunque solo con archivos (sin directorios) como en la pregunta,--no-dereference
no tendría ningún efecto.Use la
-P
opción, como Ignacio Vazquez-Abrams escribió anteriormente . Lo que no mencionó es que-P
no tiene ningún efecto sin él-R
. Entonces necesitas al menoscp -RP
.(El sitio aún no me deja comentar, así que publiqué una respuesta por separado).
fuente
cp -s y cp -L son comandos especiales. Para su requerimiento, no use ninguno.
por ejemplo, copiar un directorio DIR que contiene ay un enlace simbólico b que apunta a a.
Lo que necesita es N / a (= DIR / a) y N / b -> ../ N / a; así que simplemente copie sin desreferenciar, usando la opción cp -P. Creo que este también es el valor predeterminado para cp.
consulte
man cp
ocp --help
para más opciones.fuente