Copie múltiples fuentes a múltiples destinos simultáneamente


2

Supongamos que necesito copiar archivos

~/path/to/file a user@remote:/path/to/file

~/path/to/another/file a user@remote:/path/to/another/file

~/path/alternative a user@remote:/path/alternative

¿Hay alguna manera de hacer esto usando rsynco scp?

He intentado rsync ~/path/{to/file,to/another/file,alternative} user@remote:/path

Pero no es una opción si necesito copiar a otro destino como another_path.

Copiar archivo por archivo es demasiado largo si necesito copiar al menos 20 archivos.


Si no desea transferir todo el contenido de, ~/path/entonces debe mirar la --files-fromopción de rsync .
wurtel

@wurtel, esta es realmente la mejor decisión para abordar el problema hasta ahora. Si responde la pregunta, aceptaré.
Nemoden

Respuestas:


1

Si desea transferir una selección de archivos a través de rsync, es decir, no todo el directorio, incluidos los contenidos, entonces la mejor manera de hacerlo es mediante la --files-fromopción de rsync . Coloque las rutas de los archivos que desea transferir, en relación con el directorio de origen que especifique. Consulte la página de manual de rsync para obtener información más detallada.


0

Este script copiará un número arbitrario de directorios de entrada, a un número arbitrario de hosts, en paralelo mediante el uso de trabajos de fondo de shell. Aquí usé cpio porque es fácil dividir y canalizar los archivos de entrada, pero puede modificar esto para usar rsync --files-fromtambién.

Uso: multi-cpio.sh <srcfile> <dstfile> (requiere claves ssh en su lugar para el inicio de sesión no interactivo)

srcfile contiene un directorio por línea, como:

/usr/share/man/man1
/usr/share/man/man3
/usr/share/man/man5

dstfile contiene un objetivo remoto por línea, como:

user@host:/tmp/a
user@host:/tmp/b
user@host:/tmp/c

... y la fuente de multi-cpio.sh:

#!/bin/bash 

SRCLIST=$1
DSTLIST=$2

# create temporary files, safely, in /tmp with mcpio prefix
TEMP=`tempfile -p mcpio`

# loop over input file and create a list of all files to be copied
for I in `cat $SRCLIST` ; do
  find $I -depth -print >>$TEMP
done

# split the file into CPU count + factor
# set to '4' here, seems like ~6x CPIO will max my 1Gb Ethernet link to ~800Mbps in atop
SPLITCOUNT= $(( $( wc -l $TEMP | cut -d' ' -f1) / $(( $( grep processor /proc/cpuinfo | wc -l ) + 4 )) ))
split -l $SPLITCOUNT $TEMP $TEMP 


# nested loops, for each target and for each chunk, start a background copy


for DEST in `cat $DSTLIST` ; do
  # this selects the "user@host" from user@host:/target/path
  HOST=$(expr substr $DEST 1 $(($(expr index $DEST :)-1)))
  # this selects the "/target/path" from user@host:/target/path
  DIR=$(expr substr $DEST $(($(expr index $DEST :)+1)) $(expr length $DEST))

  # loop over all the split tempfiles with ${TEMP}??
  for I in ${TEMP}?? ; do
   # use cpio in copy-out mode to stream the files through ssh
   # then ensure the target is in place in the remote host, cd into it,
   # and copy-in the files.
   # note the '&' at the end backgrounds this command, so the loop
   # will continue and generate more concurrent background jobs
   cat $I | cpio -o | ssh $HOST \
     "mkdir $DIR ; cd $DIR && cpio -idum --no-absolute-filenames" & 
   # sleep for a second before the next spawn to allow for ssh auth
   #  and so sshd doesn't start dropping new sessions
   sleep 1
  done
done

# cleanup the tempfiles
rm ${TEMP}??
rm $TEMP

Consulte también http://rightsock.com/~kjw/Ramblings/tar_v_cpio.html para obtener referencias adicionales de cpio y la inspiración para este script.

Editar: sintaxis alternativa para un solo src dst, sin crear srcfile destfile:

multi-cpio.sh <(echo "/path/to/src") <(echo "user@host:/path/to/dest")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.