ftp下载速度很慢,如何减少登录次数?

时间:2012-12-18 16:31:46

标签: bash shell ftp download sftp

从远程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 ...)

所以我写了一个shell脚本如下:

#!/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"是下载过程中最耗时的部分。有没有更好的解决方案,所以我不需要一直登录?非常感谢!

1 个答案:

答案 0 :(得分:2)

一些选项:

  1. 使用mirror中的lftp来简单地获取所需的整个目录结构。看起来远程端具有或多或少正确的目录结构(除uniform之外),因此如果您在本地镜像远程端,则可以将mv本地目录放在正确的位置。 / LI>
  2. 预先创建所有本地目录,然后创建一个包含您想要获取的所有文件的脚本文件(穿插您需要将它们放在正确位置的所有lcd命令,然后执行该脚本文件的单个lftp -f。这将在一次登录中批量处理所有获取。