
Estoy usando scp para copiar un directorio de un servidor remoto a un nuevo directorio (es decir, simplemente cambiando el nombre) en otro servidor remoto como:
scp -prq server1:dir1 server2:dir2
Esto funciona bien si dir2 no existe en el servidor2, crea un nuevo directorio llamado dir2 que contiene todo, desde dir1 en el servidor1.
El problema surge cuando dir2 ya existe en el servidor2 (NOTA: no tengo forma de saber esto de antemano o de eliminar dir2 en el servidor2 de antemano). Lo que sucede es que obtengo una copia de dir1, llamada dir1, en dir2.
Estoy seguro de que me falta algo básico, pero parece que no puedo resolverlo.
¡Cualquier ayuda muy apreciada!
Saludos,
Giles
Bien, tengo menos de 10 repeticiones y no me pueden pedir que espere 8 horas, así que esto es lo que obtuve:
Aquí hay un script que funciona para mí:
#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "failed ... trying method 2"
scp -prq server1:dir1 server2:dir2
fi
exit
Todavía no estoy seguro de cómo hacer esto con un solo comando o incluso si es posible.
Saludos @mindthemonkey, a veces simplemente tener un nuevo punto de vista puede ayudar a señalar el camino.
Respuesta1
Utilice esta sintaxis de "punto":
scp -prq server1:dir1/. server2:dir2/
Esto copia el contenido de ese directorio, en lugar del directorio en sí. Y creo que es más portátil que *
global.
Respuesta2
Normalmente, para controlar la creación de directorios es necesario utilizar un final /
para implicar una ruta completa, pero creo que esto no podrá crear el directorio si no existe:
scp -prq server1:dir1/* server2:dir2/
Esto también podría quedar oculto. archivos debido a la expansión * glob (sin algunostrabajo específico de shell complicado)
Puedes abordarlo de manera diferente con ssh
y tar
.
ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"
Pero esto significa que el tráfico pasa por su máquina local.
Respuesta3
purguelo usando ssh primero y luego vuelva a crearlo con scp. es decir, en un archivo de script...
ssh -i ~/.ssh/[clave_privada] usuario@servidor2 "rm -rf dir2; salir;"
scp -prq servidor1:dir1 servidor2:dir2
Respuesta4
Me golpeé la cabeza exactamente con este mismo problema, y lo que terminé haciendo fue semi-puntear: si dir2 es [STUFF]/parent/child2
, cambio el nombre, copio o vinculo dir1 (según corresponda a la situación) a dir1_child2 en el servidor1 para que su última ruta El componente también lo es child2
, y luego simplemente ejecuta
scp -prq server1:dir1_child2 server2:[STUFF]/parent
Esto se ejecuta independientemente de que child2 esté presente en el directorio principal de dir2 y reemplaza felizmente a dir2 si lo está.