首页 > 解决方案 > 使用通配符并循环从 sftp 服务器下载文件

问题描述

我正在尝试从 sftp 服务器下载一堆文件。服务器的组织结构如下:每年有一个文件夹,每年有一个文件夹,每天有一个文件夹。每天,.nc我要下载 8 个以结尾的文件。文件本身的名称太疯狂而无法跟踪。我尝试了几种不同的方法,但未能成功给出get正确的指示来获取文件。我当前的版本是在连接到 sftp 之前有一个循环,这样我就可以编写名称,然后连接到 sftp 并下载该文件:

for i in `seq 1 1 366`;
        do
            if [ $i -lt 10 ]; then
                today='00$i/*.nc' 
            elif [ $i -ge 10 ] && [ $i -lt 100 ]; then
                today= '0$i/*.nc' 
            elif [ $i -ge 100 ]; then
                today= '$i/*.nc' 
            fi
        done

sshpass -p $(cat ~/Code/sftp_passwd.txt) sftp cgerlein@cygnss-sftp-1.engin.umich.edu <<EOF

cd ..
cd ..
cd /data/cygnss/products/CDR/l1/2019/

get $today /scratch/myfolder/ 
quit
EOF

我不认为get是喜欢那里的通配符。这甚至可能不是最好的方法。有什么建议么?谢谢!

标签: bashgetsftpwildcard

解决方案


您可以使用printf()前导零来格式化文件名。

sftp命令需要在循环内。

后面不能有空格today=

cd ..在更改为绝对路径名之前不需要。

for i in {1..366}
do
    today=$(printf "%03d/*.nc" $i)
    sshpass -p $(cat ~/Code/sftp_passwd.txt) sftp cgerlein@cygnss-sftp-1.engin.umich.edu <<EOF
cd /data/cygnss/products/CDR/l1/2019/
get $today /scratch/myfolder/ 
quit
EOF
done

顺便说一句,您可以使用 进行通配符下载curl,请参阅使用 cURL 下载目录中的所有文件


推荐阅读