如何迭代 bash 数组并有效地创建 SCP 命令?

如何迭代 bash 数组并有效地创建 SCP 命令?

我需要将文件从 scp到machineB。我正在从 运行以下 shell 脚本。我已正确设置了 ssh 密钥。machineCmachineAmachineA

如果文件不在 中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甚至可以实现在所有三台服务器上创建相同镜像的功能。

相关内容