Haga que scp siempre sobrescriba o cree un directorio

26

Estoy usando scp para copiar un directorio de un servidor remoto a un nuevo directorio (es decir, solo 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 ya existe dir2 en el servidor2 (NOTA: no tengo forma de saberlo de antemano o de eliminarlo en dir2 en el servidor2 de antemano). Lo que sucede es que obtengo una copia de dir1, llamada dir1, en dir2.

Estoy seguro de que hay algo básico que me falta, pero parece que no puedo resolverlo.

Cualquier ayuda muy apreciada!

Saludos,

Giles

De acuerdo, tengo menos de 10 repeticiones y no puedo esperar $ 8, 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 en un solo comando o incluso si es posible.

Saludos @mindthemonkey, a veces solo obtener un nuevo punto de vista puede ayudar a señalar el camino.

Giles
fuente
tienes acceso scp pero no ssh?
Matt
Eso es correcto
Giles
El único problema es que intentará la segunda copia en caso de falla, que no necesariamente es dir2. Tal vez si puede llegar a una prueba que prácticamente no hace nada (por ejemplo, copie un directorio en blanco). Luego, según la salida, ejecute scp1 o scp2
Matt
Buen punto, lo tendré en cuenta en el futuro y volveré a publicar si se me ocurre algo.
Giles
Puedes sftp? luego verifique la salida de a cd dir2.
Matt

Respuestas:

34

Use 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 *globbing.

cronospoon
fuente
2
-p ⇒ "Conserva los tiempos de modificación, tiempos de acceso y modos del archivo original". -r ⇒ "Copiar recursivamente directorios completos". -q ⇒ "Desactiva el medidor de progreso". Fuente: computerhope.com/unix/scp.htm
kr85
1
Esto me da un error:scp: error: unexpected filename: .
Andrew Koster,
1

Normalmente, para controlar la creación del directorio, debe usar un seguimiento /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 faltar oculto. archivos debido a la expansión * glob (sin un trabajo complicado de shell específico )

Puede 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.

Mate
fuente
scp -prq server1: dir1 / * server2: dir2 /
Giles
@Giles, ¿estás diciendo que funciona?
Matt
1
Extraño, lo edité pero se ha perdido, no, eso no funciona, si el directorio no existe, entonces scp da un error. Además, no tengo ssh disponible en este caso particular (problema con los derechos de usuario). Sin embargo, esto me da una idea, ya que estoy haciendo esto en un script, puedo probar lo anterior, capturar cualquier error y, en caso de error, probar la versión básica de mi primera publicación. Gracias por la ayuda @mindthemonkey
Giles
1
Es un error 'Es un directorio' cuando el directorio de destino no existe para mí.
Matt
1
Sí, yo también, un error extraño dado que el directorio no existe.
Giles