Hacer que scp siempre sobrescriba o cree un directorio

Hacer que scp siempre sobrescriba o cree un directorio

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 sshy 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á.

información relacionada