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

Bash ftp下载速度很慢,如何减少登录次数?,bash,shell,ftp,download,sftp,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 ----

我从远程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 ""
#/bin/bash
stty-echo
阅读-p“输入密码[输入]:”此通行证;回声
短回声
用户名=“超人”
URL=“supercomputer.org”
ROOTPATH=“/home/remote/folder/CASE”
TIMELIST=“0.1 0.2 0.3 0.4 0.5 0.6”
mkdir-p/home/LOCALFOLDER
LOCALDIR=/home/LOCALFOLDER
cd$LOCALDIR
回声“”
echo“本地目录:$LOCALDIR
echo“远程URL:$URL
echo“远程目录:$ROOTPATH”
回声“”
对于$TIMELIST中的TIMENAME;做
对于((i=0;i<1200;i++));做
CURPROC=“处理器”${i}
FILEPATH=$ROOTPATH/$CURPROC
mkdir-p$PWD/$CURPROC/$TIMENAME
cd$PWD/$CURPROC/$TIMENAME
echo-e“文件夹-”$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“获取$FILEFULLNAMEA$FILEFULLNAMEB$FILEFULLNAMEC$filefullnamead$FILEFULLNAMEE$FILEFULLNAMEF$FILEFULLNAMEG$FILEFULLNAMEH;再见”
cd../。。
完成
完成
回声“”
但是我发现
lftp sftp://$USERNAME:$THISPASS@$URL-e“get$FILEFULLNAMEA$FILEFULLNAMEB$FILEFULLNAMEC$FILEFULLNAMEA$FILEFULLNAMEF$FILEFULLNAMEG$FILEFULLNAMEH;bye”
是下载过程中最耗时的部分。有没有更好的解决方案,这样我就不需要一直登录?非常感谢

一些选项:

  • lftp
    中使用
    mirror
    ,只需获取所需的整个目录结构。看起来远程端或多或少有正确的目录结构(除了
    uniform
    ),因此如果您在本地镜像远程端,您只需将目录本地镜像到正确的位置即可
  • 在前面创建所有本地目录,然后创建一个脚本文件,其中包含所有要获取的文件(散布有所有要将它们放置在正确位置的
    lcd
    命令,然后对该脚本文件执行一个
    lftp-f
    。这也将在一次登录中批处理所有获取

  • 我的时间目录列表随着我的模拟而增加,这意味着,现在它有
    {0,0.1,0.2,0.3}
    ,几个小时后它将有
    {0,0.1,0.2,0.3,0.4}
    。每次,我只想从所有处理器下载一个单一时间快照,所以我想
    镜像
    方法不是我想要的。或者我可以用蛮力创建一个非常大的脚本文件,然后使用
    lftp-f
    ?@Daniel你发现了什么?请分享!