Bashシェルスクリプトから一度に1つずつ、代わりに3つのファイルを同時にコピーするにはどうすればよいですか?

Bashシェルスクリプトから一度に1つずつ、代わりに3つのファイルを同時にコピーするにはどうすればよいですか?

machineA.NETでファイルを変換するシェルスクリプトを実行していますmachineBmachineCmachineA

ファイルが にない場合は必ず になけれmachineBばなりません。machineCだからまずファイルをコピーしてみてmachineB、ファイルがなければ同じファイルをコピーしmachineBてみましょう。machineC

このフォルダ内には次のフォルダがmachineBあります。machineCYYYYMMDD

/data/pe_t1_snapshot

したがって、上記のフォルダ内で、この形式の最新の日付が何であれ、そのYYYYMMDDフォルダをファイルのコピーを開始する必要があるフルパスとして選択します。

20140317したがって、これが内部の最新の日付フォルダである場合、/data/pe_t1_snapshotこれが私のフルパスになるとしましょう。

/data/pe_t1_snapshot/20140317

machineBどこでファイルのコピーを開始する必要がありますかmachineC?と400からファイルをコピーする必要があります。各ファイルサイズはです。machineAmachineBmachineC2.5 GB

以前は、ファイルを1つずつコピーしようとしましたが、machineA非常に遅かったです。machineABashシェルスクリプトのスレッドを使用して「3つの」ファイルを一度にコピーする方法はありますか?

machineA以下は、frommachineBとファイルを1つずつコピーするシェルスクリプトですmachineC

#!/usr/bin/env bash

readonly PRIMARY=/export/home/david/dist/primary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot

PRIMARY_PARTITION=(0 548 272 4 544 276 8 556 280 12 552 284 16 256 564 20 260 560 24 264 572) # this will have more file numbers around 200

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

## Build your list of filenames before the loop. 
for n in "${PRIMARY_PARTITION[@]}"
do
    primary_files="$primary_files :$dir1"/t1_weekly_1680_"$n"_200003_5.data
done

if [ "$dir1" = "$dir2" ]
then
    find "$PRIMARY" -mindepth 1 -delete
    rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/ 2>/dev/null
    rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/ 2>/dev/null
fi  

それで、一度に1つのファイルをコピーするのではなく、「3つの」ファイルを一度にコピーするのはどうでしょうか? 3つのファイルが完了したら、リスト内の他の3つのファイルに移動してコピーします。同じ時間?

私は3つのパテインスタンスを開き、同時に3つのインスタンスすべてからファイルをコピーしました。 3つのファイルすべてが約50秒でコピーされたので、私は高速です。このため、一度に1つのファイルをコピーするのではなく、一度に3つのファイルをコピーしてみました。

大丈夫ですか?もしそうなら、誰でも例をあげることができますか?私はそれを試してみて、それがどのように進行するのか見たかったのです。

@terdonは上記の問題を解決するのに役立ちましたが、一度に3つのファイルをコピーしてどのように機能するかを確認したいと思います。

直す:-

以下は、上記のシェルスクリプトを簡略化したバージョンです。machineBこれを行うと、machineCに存在するファイル番号をコピーしようとします。machineAmachineAPRIMARY_PARTITION

#!/usr/bin/env bash

readonly PRIMARY=/export/home/david/dist/primary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot

PRIMARY_PARTITION=(0 548 272 4 544 276 8 556 280 12 552 284 16 256 564 20 260 560 24 264 572) # this will have more file numbers around 200

dir1=/data/pe_t1_snapshot/20140414
dir2=/data/pe_t1_snapshot/20140414

## Build your list of filenames before the loop. 
for n in "${PRIMARY_PARTITION[@]}"
do
    primary_files="$primary_files :$dir1"/t1_weekly_1680_"$n"_200003_5.data
done

if [ "$dir1" = "$dir2" ]
then
    # delete the files first and then copy it.
    find "$PRIMARY" -mindepth 1 -delete
    rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/
    rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/
fi

ベストアンサー1

複数のコピーを並列に実行することはほとんど役に立ちません。制限要素がネットワーク帯域幅であるかディスク帯域幅であるかにかかわらず、それぞれ1/N倍速いNパラレルストリームが生成されます。

一方、複数のソース(ここではBとC)から複製するとき、ボトルネックがBとC側(共通側ではない)にある場合です。したがって、並列にコピーを試みることができます。

rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/ &
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/ &
wait

2 つの rsync コマンドの出力を混ぜ合わせて別々のファイルに送ることができます。

log_base=$(date +%Y%m%d-%H%M%S-$$)
rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/ >$log_base-B.log &
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/ >$log_base-C.log &
wait

スクリプトは同じ宛先に対して複数のSSH接続を使用します。 SSH接続の確立に避けられない遅延があります。接続を開いたまま再利用すると時間を節約できます。主な接続

おすすめ記事