Wie iteriere ich Bash-Arrays und erstelle effizient einen SCP-Befehl?

Wie iteriere ich Bash-Arrays und erstelle effizient einen SCP-Befehl?

Ich muss die Dateien per SCP von machineBund machineCnach übertragen machineA. Ich führe mein folgendes Shell-Skript von aus machineA. Ich habe die SSH-Schlüssel richtig eingerichtet.

Wenn die Dateien nicht in vorhanden sind machineB, dann sollten sie in vorhanden sein 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

Meine Frage lautet nun: Wenn Sie sich meinen obigen SCP-Befehl ansehen, habe ich [$el]derzeit (was falsch ist): Ich muss dies durch ersetzen PARTITION, was bedeutet, dass ich iterieren PARTITIONund [$el]durch jede Zahl in PARTITION ersetzen muss.

Mein scp-Befehl sollte also so aussehen, wenn ich PARTITIONihn einzeln iteriere -

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

Problemstellung:-

  1. Wie iteriere ich PARTITION so, dass ich den obigen SCP-Befehl ausführen kann?
  2. Und wie Sie sehen, kopiere ich die Dateien einzeln in machineA /data01/primary/den Ordner. Gibt es eine bessere Möglichkeit, dies zu tun? Das heißt, kann ich alle Dateien auf einmal kopieren, anstatt es einzeln zu tun?

Antwort1

Sie können das PARTITION-Array wie folgt durchlaufen

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

Antwort2

Ich würde empfehlen, sich rsyncfür diese Aufgabe anzusehen, da es für diese Art von Backup insgesamt mehr Funktionalität bietet. Sie können dies von Maschine A aus ausführen und es auf die Snapshot-Verzeichnisse auf B und C richten, und Ihr gesamtes Snapshot-Verzeichnis würde gespiegelt.

Sie könnten crondies dann in festgelegten Intervallen planen. scpist ideal für einmalige Kopien, aber Ihr Szenario klingt nach einem regelmäßigen Sicherungsjob. rsynckommuniziert auch über Standard-SSH-Ports, wenn es also scpderzeit funktioniert, sollten keine Änderungen am Netzwerk, an Firewalls usw. erforderlich sein.

Damit rsynckönnten Sie bei Bedarf sogar eine Funktion implementieren, um auf allen drei Servern ein identisches Spiegelbild zu erstellen.

verwandte Informationen