Назад | Перейти на главную страницу

Как мне перебрать массивы bash и эффективно создать команду 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] с каждым номером в РАЗДЕЛЕ.

Итак, моя команда 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/ папка. Есть ли лучший способ сделать это? То есть, могу ли я скопировать все файлы за один раз вместо того, чтобы делать это по одному?

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

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

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

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

С участием rsync вы даже можете реализовать функциональность для создания идентичного зеркала на всех трех серверах, если это потребуется.