【问题标题】:Downloading files from sftp server with wildcard and in a loop使用通配符并循环从 sftp 服务器下载文件
【发布时间】:2019-10-11 15:51:35
【问题描述】:

我正在尝试从 sftp 服务器下载一堆文件。服务器的组织结构如下:每年有一个文件夹,每年有一个文件夹,每天有一个文件夹。每天,我要下载 8 个以.nc 结尾的文件。文件本身的名称太疯狂而无法跟踪。我尝试了几种不同的方法,但未能成功地为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 喜欢其中的通配符。这甚至可能不是最好的方法。有什么建议么?谢谢!

【问题讨论】:

  • 变量不在单引号内展开,只有双引号。
  • 顺便说一句,您可以使用$(printf '%03d' $i) 来获取带有前导零的数字,而不是if 语句。
  • 我认为你需要使用mget命令来获取多个带有通配符的文件。
  • @Barmar 谢谢,双引号 + mget 有效,但现在它从第一个文件夹下载所有文件,然后停止。我尝试将 sshpass [ ...] quit EOF 放入 do 循环中,但这不起作用。
  • 啊,我认为这只是表格有些奇怪,但现在似乎有效。谢谢!

标签: bash get sftp wildcard


【解决方案1】:

您可以使用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 进行通配符下载,请参阅downloading all the files in a directory with cURL

【讨论】:

  • 好的,其他的问题都解决了。
猜你喜欢
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多