Как эффективно перебирать массивы bash и создавать команды SCP?

Как эффективно перебирать массивы bash и создавать команды SCP?

Мне нужно scp файлы из machineBи machineCв machineA. Я запускаю свой скрипт оболочки ниже из machineA. Я правильно настроил ключи ssh.

Если файлов нет в machineB, то они должны быть в 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

Теперь мой вопрос: если вы посмотрите на мою команду scp выше, [$el]на данный момент (что неверно), мне нужно заменить это на PARTITION, что означает, что мне нужно выполнить итерацию PARTITIONи заменить [$el]на каждое число в PARTITION.

Итак, моя команда scp должна выглядеть так, если я буду выполнять ее PARTITIONпоочередно:

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

Постановка задачи:-

  1. Как мне выполнить итерацию PARTITION таким образом, чтобы можно было выполнить указанную выше команду SCP?
  2. И еще, как вы видите, я копирую файлы по одному в machineA /data01/primary/папку. Есть ли способ сделать это лучше? То есть, могу ли я копировать все файлы вместе за один раз, а не по одному?

решение1

Вы можете выполнить итерацию по массиву PARTITION следующим образом:

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

решение2

Я бы посоветовал рассмотреть rsyncдля выполнения этой задачи, так как она обеспечивает большую функциональность для этого типа резервного копирования. Вы можете выполнить это с machineA, указав на каталоги снимков на B и C, и весь ваш каталог снимков будет зеркалирован.

Затем вы можете использовать cronего для планирования через заданные интервалы времени. scpИдеально подходит для одноразового копирования, но ваш сценарий похож на обычное задание по резервному копированию. rsyncТакже взаимодействует через стандартные порты SSH, поэтому, если scpработает в настоящее время, не должно быть необходимости вносить изменения в сеть, брандмауэры и т. д.

rsyncПри необходимости можно даже реализовать функционал по созданию идентичного зеркала на всех трех серверах .

Связанный контент