¿Cómo _MOVE_ archivos con scp?

46

¿Cómo no copiar pero mover archivos de un servidor a otro (ambos Linux)?

man scpNo me dio nada útil. No puedo usar 'scp' y luego 'rm' porque debo asegurarme de que el archivo se haya transferido correctamente. Si hay algún error durante la transferencia, el archivo no debe eliminarse.

Tal vez debería usar el código de salida de alguna manera, pero ¿cómo? Además, hay muchos archivos, y si el último archivo falla, sería una opción no tan buena mantener todos los archivos transferidos con éxito.

Tal vez hay algo además de SCP?

Putnik
fuente

Respuestas:

47

rsync sobre ssh es probablemente su mejor apuesta con la --remove-source-filesopción

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

una prueba rápida da;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

Como @SvenW mencionó, -e sshes el valor predeterminado, por lo que puede omitirse.

Tom H
fuente
77
-e sshes el valor predeterminado implícito durante muchos años, por lo general ya no es necesario usar este parámetro.
Sven
@SvenW ah bueno saberlo! No tengo mucha necesidad de rsync día a día ya que scp admite el modo recursivo para la mayoría de los propósitos.
Tom H
Después de eso, use esto para limpiar las carpetas vacías (rsync no las eliminará): serverfault.com/a/95935/58568
bmaupin
1
Acabo de agregar smv() { rsync -az --remove-source-files "$@"; }a mi caja de herramientas. Gracias.
Rhys Ulerich
¿Qué pasa si no tienes rsync? Por ejemplo, OpenWrt no tiene rsync y necesito usar scp para mover archivos. ¿Qué hacer ahora?
Valentt
19

Usar en rsynclugar de scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

Más información con man rsync.

Sven
fuente
17

Esta pregunta ha sido respondida bien, y la respuesta fue aceptada, pero como está flotando en la parte superior de la primera página, pensé que al menos trataría de responderla con mayor precisión, aunque con menos elegancia. Sí, puede usar el código de retorno scp, y lo hago a menudo. En bash:

scp foo user@server:/destination && rm foo

Tomo su punto sobre múltiples archivos para copiar y manejar los errores en la pila correctamente, así que para múltiples archivos:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

Esto último solo es práctico si lo está usando ssh-agent, pero espero que lo sea.

MadHatter apoya a Monica
fuente
1
Siento que esta debería haber sido la respuesta. Responde a la pregunta hecha con precisión.
Travis Griggs
Como SCP no maneja la limitación de ancho de banda (AFAIK), utilicé su respuesta con rsync para mover archivos uno por uno en un ancho de banda definido. Gracias !
Moonchild
@Moonchild, scp en realidad puede manejar los límites de ancho de banda usando la -lbandera. Por ejemplo, -l 8192para limitar las transferencias a 8192 kb / s
Spencer D
3

en mi situación, el puerto ssh no es 22, entonces

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

funciona para mi.

Gato grande
fuente
55
Es mucho mejor colocar números de puerto ssh personalizados en su archivo de configuración ssh (~ / .ssh / config) que especificarlos para cada comando. Se puede especificar globalmente, por host o para una expresión regular que coincida con el nombre de host.
furtivamente
¿Cómo configurar los puertos individualmente para el origen y el destino?
Brethlosze
3

si tiene un servidor de destino más antiguo que yo, no puede usar

--remove-source-files

pero tienes que usar

--remove-sent-files --protocol=29

en lugar.

andrej
fuente
3

Si hacerlo en dos pasos no es un problema, puede usarlo scppara copiar el archivo del servidor remoto y luego ejecutarlo ssh -e "rm /path/to/file"para eliminarlo del disco. Al mover archivos, especialmente entre máquinas, las cosas pueden salir mal, por lo que puede ser bueno realizar la copia y eliminar por separado, y solo eliminar el archivo cuando esté seguro de que se ha copiado con éxito primero.

Giannis
fuente