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.

Nemoden
fuente
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.

wurtel
fuente
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")
Glallen
fuente