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

1

Eu preciso scp os arquivos de machineB e machineC para machineA . Estou executando meu script de shell abaixo de machineA . Eu configurei as chaves ssh corretamente.

Se os arquivos não estiverem em machineB , eles devem estar lá 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, eu tenho [$el] por enquanto (o que está errado), eu preciso substituir isso por PARTITION , o que significa que eu preciso iterar PARTITION e substitua [$el] por cada número em PARTITION.

Então meu comando scp deve ficar assim se eu iterar PARTITION um 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/.

Descrição do problema: -

  1. Como faço para iterar PARTITION de tal forma que eu possa fazer o comando SCP acima?
  2. E também, como você pode ver, estou copiando os arquivos um por um na pasta machineA /data01/primary/ . Existe alguma maneira melhor de fazer isso? Ou seja, posso copiar todos os arquivos juntos em um único tiro, em vez de fazê-lo um por um?
por arsenal 24.12.2013 / 11:20

2 respostas

1

Você pode iterar na matriz PARTITION assim

for el in "${PARTITION[@]}"
do
    echo "$el"
done
    
por 24.12.2013 / 11:30
0

Eu aconselharia olhar para rsync para concluir esta tarefa, pois ela fornece maior funcionalidade para esse tipo de backup. Você poderia executar isso a partir de machineA, apontando para os diretórios de snapshots em B & C, e todo o seu diretório de snapshots seria espelhado.

Você pode usar cron para agendar isso em intervalos definidos. scp é ideal para cópias únicas, mas seu cenário parece um trabalho de backup regular. rsync também se comunica através de portas SSH padrão, portanto, se scp funcionar no momento, não haverá necessidade de alterações na rede, firewalls, etc.

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

    
por 24.12.2013 / 13:49