¿Cómo itero matrices bash y hago un comando SCP de manera eficiente?

¿Cómo itero matrices bash y hago un comando SCP de manera eficiente?

Necesito escanear los archivos desde machineBy machineChacia machineA. Estoy ejecutando mi siguiente script de shell desde machineA. He configurado las claves ssh correctamente.

Si los archivos no están en machineB, entonces deberían estar en machineC.

#!/bin/bash

readonly PRIMARY=/data01/primary/.
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION=(0 3 5 7 9)

dir1=/bat/data/snapshot/20131222
dir2=/bat/data/snapshot/20131222

scp david@${FILERS_LOCATION[0]}:$dir1/weekly_1980_[$el]_200003_5.data $PRIMARY || scp david@${FILERS_LOCATION[1]}:$dir2/weekly_1980_[$el]_200003_5.data $PRIMARY

Ahora mi pregunta es si echas un vistazo a mi comando scp anterior, que tengo [$el]por ahora (lo cual es incorrecto), necesito reemplazar esto con PARTITION, lo que significa que necesito iterar PARTITIONy reemplazar [$el]con cada número en PARTICIÓN.

Entonces mi comando scp debería verse así si lo repito PARTITIONuno por uno:

scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_0_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_0_200003_5.data /data01/primary/.

scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_3_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_3_200003_5.data /data01/primary/.

scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_5_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_5_200003_5.data /data01/primary/.

scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_7_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_7_200003_5.data /data01/primary/.

scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_9_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_9_200003_5.data /data01/primary/.

Planteamiento del problema:-

  1. ¿Cómo itero PARTICIÓN de tal manera que pueda ejecutar el comando SCP anterior?
  2. Y además, como puedes ver, estoy copiando los archivos uno por uno en machineA /data01/primary/la carpeta. ¿Existe alguna forma mejor de hacer esto? Es decir, ¿puedo copiar todos los archivos juntos de una sola vez en lugar de hacerlo uno por uno?

Respuesta1

Puedes iterar sobre la matriz PARTICIÓN de esta manera

for el in "${PARTITION[@]}"
do
    echo "$el"
done

Respuesta2

Recomendaría mirar rsyncpara completar esta tarea, ya que proporciona una mayor funcionalidad en todos los aspectos para este tipo de copia de seguridad. Puede ejecutar esto desde la máquina A, apuntándolo a los directorios de instantáneas en B y C, y todo su directorio de instantáneas se reflejará.

Luego podría utilizar cronpara programar esto a intervalos establecidos. scpes ideal para copias únicas, pero su escenario parece un trabajo de copia de seguridad normal. rsynctambién se comunica a través de puertos SSH estándar, por lo que si scpfunciona actualmente no debería haber necesidad de cambios en la red, firewalls, etc.

Incluso rsyncpodría implementar la funcionalidad para crear un espejo idéntico en los tres servidores si fuera necesario.

información relacionada