如何迭代 bash 數組並有效地發出 SCP 命令?

如何迭代 bash 數組並有效地發出 SCP 命令?

machineB我需要 scp 來自和machineC到的檔案machineA。我正在運行下面的 shell 腳本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 中的每個數字。

PARTITION所以如果我一項一項迭代,我的 scp 命令應該如下所示-

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完成此任務,因為它為此類備份提供了更全面的功能。您可以從機器 A 執行此操作,將其指向 B 和 C 上的快照目錄,整個快照目錄將被鏡像。

然後您可以cron按設定的時間間隔安排此操作。 scp非常適合一次性副本,但您的場景聽起來像是常規備份作業。 rsync也透過標準 SSH 連接埠進行通信,因此如果scp目前可以工作,則無需更改網路、防火牆等。

rsync如果需要,您甚至可以實現在所有三台伺服器上建立相同鏡像的功能。

相關內容