0

リモートの ftp サーバーから自分のファイル (数千のファイル) をダウンロードするのに大きな問題があります。いくつかのファイルをダウンロードすることは大したことではありませんが、何千ものファイルをダウンロードする必要がある場合、ログイン操作によってプロセス全体が非常に遅くなることがわかりました。より良いスクリプトの助けが必要です。

リモートフォルダーとファイルの構造は次のようなものです

CASE
--processor0
----0
------A.gz
------B.gz
------(and so on)
------H.gz
----0.1
------A.gz
------B.gz
------(and so on)
------H.gz
----0.2
------A.gz
------B.gz
------(and so on)
------H.gz
----(And so on with 0.3 0.4 0.5 ...)
--processor1
----0
------A.gz
------B.gz
------(and so on)
------H.gz
----0.1
------A.gz
------B.gz
------(and so on)
------H.gz
----0.2
------A.gz
------B.gz
------(and so on)
------H.gz
----(And so on with 0.3 0.4 0.5 ...)
.............(and so on)
--processor2000
----0
------A.gz
------B.gz
------(and so on)
------H.gz
----0.1
------A.gz
------B.gz
------(and so on)
------H.gz
----0.2
------A.gz
------B.gz
------(and so on)
------H.gz
----(And so on with 0.3 0.4 0.5 ...)

そこで、以下のようなシェルスクリプトを書きました。

#!/bin/bash

stty -echo
read -p "Enter your password [ENTER]: " THISPASS; echo
stty echo
USERNAME="superman"
URL="supercomputer.org"

ROOTPATH="/home/remote/folder/CASE"
TIMELIST="0 0.1 0.2 0.3 0.4 0.5 0.6"

mkdir -p /home/LOCALFOLDER
LOCALDIR=/home/LOCALFOLDER
cd $LOCALDIR

echo ""
echo "Local Directory  : "$LOCALDIR
echo "Remote URL       : "$URL
echo "Remote Directory : "$ROOTPATH
echo ""

for TIMENAME in $TIMELIST; do
    for (( i = 0; i < 1200; i++ )); do
        CURPROC="processor"${i}
        FILEPATH=$ROOTPATH/$CURPROC
        mkdir -p $PWD/$CURPROC/$TIMENAME
        cd $PWD/$CURPROC/$TIMENAME
        echo -e "FOLDER - "$FILEPATH/$TIMENAME

        FILEFULLNAMEA=$FILEPATH/$TIMENAME/"A.gz"
        FILEFULLNAMEB=$FILEPATH/$TIMENAME/"B.gz"
        FILEFULLNAMEC=$FILEPATH/$TIMENAME/"C.gz"
        FILEFULLNAMED=$FILEPATH/$TIMENAME/"D.gz"
        FILEFULLNAMEE=$FILEPATH/$TIMENAME/"E.gz"
        FILEFULLNAMEF=$FILEPATH/$TIMENAME/"F.gz"
        FILEFULLNAMEG=$FILEPATH/$TIMENAME/"G.gz"
        FILEFULLNAMEH=$FILEPATH/$TIMENAME/"H.gz"
        lftp sftp://$USERNAME:$THISPASS@$URL -e "get $FILEFULLNAMEA $FILEFULLNAMEB $FILEFULLNAMEC $FILEFULLNAMED $FILEFULLNAMEE $FILEFULLNAMEF $    FILEFULLNAMEG $FILEFULLNAMEH; bye"
        cd ../..
    done
done
echo ""

lftp sftp://$USERNAME:$THISPASS@$URL -e "get $FILEFULLNAMEA $FILEFULLNAMEB $FILEFULLNAMEC $FILEFULLNAMED $FILEFULLNAMEE $FILEFULLNAMEF $ FILEFULLNAMEG $FILEFULLNAMEH; bye"しかし、このダウンロード中に最も時間がかかる部分であることがわかりました。常にログインする必要がないようにするためのより良い解決策はありますか? どうもありがとう!

4

1 に答える 1

2

いくつかのオプション:

  1. mirrorinを使用しlftpて、必要なディレクトリ構造全体を簡単に取得します。リモート側には (を除いて) 多かれ少なかれ適切なディレクトリ構造があるように見えるuniformので、リモート側をローカルにミラーリングする場合はmv、ディレクトリをローカルに適切な場所に単純に配置できます。
  2. 前もってすべてのローカル ディレクトリを作成してから、取得するすべてのファイルを含む単一のスクリプト ファイルを作成します (lcd適切な場所に配置するために必要なすべてのコマンドを散在させてからlftp -f、そのスクリプト ファイルを1 つ実行します。同様に、1 回のログインですべての取得をバッチ処理します。
于 2012-12-18T16:47:45.913 に答える