如何在我的下面的shell脚本中使用rsync而不是scp来复制文件?

joh*_*ohn 4 linux bash rsync scp gnu-parallel

我正在使用scp并行使用GNU并行复制文件与我的下面的shell脚本,它工作正常.

我不知道如何在我的下面的shell脚本rsync中代替scp.我试图看看rsync与scp传输速度相比是否会有更好的性能.

以下是我的问题描述 -

我从复制文件machineB和machineC成machineA,因为我跑我的下面shell脚本上machineA.

如果文件不在那里machineB它应该在那里machineC肯定,所以我会尝试从machineB第一次复制文件,如果它不存在machineB那么我将尝试从中复制相同的文件machineC.

我使用GNU Parallel库并行复制文件,它工作正常.目前我正在为PRIMARY和SECONDARY并行复制五个文件.

下面是我的shell脚本 - 我有 -

#!/bin/bash

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers

export dir3=/testing/snapshot/20140103

do_Copy() {
  el=$1
  PRIMSEC=$2
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.
}
export -f do_Copy

parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" &
parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."
Run Code Online (Sandbox Code Playgroud)

有没有更换我上面任何方式scp使用命令rsync,但我还是想在平行复制5个文件都为PRIMARY和SECONDARY同步?

Zer*_*eus 6

rsync旨在有效地同步文件夹和文件的两个层次结构.

虽然它可以用来传输单个文件,但是除非你已经在每一端都有一个版本的文件,它们之间的差别很小,否则它对你的使用非常有帮助.rsync在层次结构中的各个文件上并行运行多个实例会破坏工具的用途.

虽然triplee是正确的,你的任务是I/O密集型而非CPU密集型的,因此并行任务将在典型情况下,您是否使用不利于rsync或scp,有一种情况,其中并列化网络传输可以帮助:如果发件人限制请求.在这种情况下,rsync为许多不同的文件夹中的每一个运行实例可能有一些价值,但它会使您的代码复杂化,并且您必须分析这两个解决方案以发现您是否真正获得了任何好处.

简而言之:只运行单个实例rsync; 你从另一种方法中获得的性能提升不太可能是值得的.