Como faço para iterar matrizes bash e criar um comando SCP com eficiência?

Como faço para iterar matrizes bash e criar um comando SCP com eficiência?

Eu preciso copiar os arquivos de machineBe machineCpara machineA. Estou executando meu script de shell abaixo do machineA. Eu configurei as chaves ssh corretamente.

Se os arquivos não estiverem em machineB, então deverão estar em 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

Agora, minha pergunta é: se você der uma olhada no meu comando scp acima, [$el]por enquanto (o que está errado), preciso substituí-lo por PARTITION, o que significa que preciso iterar PARTITIONe substituir [$el]por cada número em PARTIÇÃO.

Portanto, meu comando scp deve ficar assim se eu iterar PARTITIONum por um -

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

Declaração do problema: -

  1. Como faço para iterar PARTITION dessa forma, para que eu possa executar o comando SCP acima?
  2. E também, como você pode ver, estou copiando os arquivos um por um para machineA /data01/primary/uma pasta. Existe alguma maneira melhor de fazer isso? Ou seja, posso copiar todos os arquivos juntos de uma só vez, em vez de fazer isso um por um?

Responder1

Você pode iterar sobre o array PARTITION assim

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

Responder2

Aconselho que você rsyncconclua esta tarefa, pois oferece maior funcionalidade geral para esse tipo de backup. Você poderia executar isso a partir da máquina A, apontando-o para os diretórios de snapshots em B e C, e todo o seu diretório de snapshots seria espelhado.

Você poderia então usar cronpara agendar isso em intervalos definidos. scpé ideal para cópias únicas, mas seu cenário parece uma tarefa de backup normal. rsynctambém se comunica através de portas SSH padrão, portanto, se scpfuncionar no momento, não deverá haver necessidade de alterações na rede, firewalls, etc.

Com rsyncvocê poderia até implementar a funcionalidade para criar um espelho idêntico em todos os três servidores, se necessário.

informação relacionada