【问题标题】:Reading Through A List of Files, then Sending those Files via FTP读取文件列表,然后通过 FTP 发送这些文件
【发布时间】:2025-12-16 14:15:01
【问题描述】:

我正在使用 Grads 脚本语言制作天气模型图表,并且我正在使用 bash 脚本,因此我可以使用 while 循环下载模型数据(grib2 格式)并为模型运行的每一帧调用 grads 脚本.现在,我有一个循环运行给定预测时间的所有脚本,并通过 FTP 上传图像输出。此 for 循环完成后,将下载下一小时的 grib2 数据,并再次运行循环。

for ((i=0;i<${#SCRIPTS[@]};i++)); do
    #define filename
    FILENAME="${FILENAMES[i]}${FORECASTHOUR}hrfcst.png" 
    #run grads script
    /home/mint/opengrads/Contents/opengrads -lbc "run /home/mint/opengrads/Contents/plotscripts/${SCRIPTS[i]} $CTLFILE $INIT_STRINGDATE $INIT_INTDATE $INITHOUR $FILENAME $h $MODEL $MODELFORTITLE 500"
    #run ftp script
    #sh /home/mint/opengrads/Contents/bashscripts/ftpsample.sh $INIT_INTDATE $INITHOUR $FILENAME $MODEL
done

这很不雅,因为我每次发送单个图像时都会打开和关闭一个 FTP 会话。我宁愿将给定预测时间的文件名的名称写入 .txt 文件(例如:在循环中有一个“echo ${FILENAME} >> FILEOFFILENAMES.txt”)并让我的 FTP 脚本读取并发送所有这些文件在一个会话中。这可能吗?

【问题讨论】:

    标签: bash ftp ftp-client grads


    【解决方案1】:

    这是可能的。您可以将其添加到您的 shell 脚本以生成 ftp 脚本,然后在生成文件后运行它:

    echo open $HOST > ftp.txt
    echo user $USER $PASS >> ftp.txt
    find . -type f -name '*hrfcst.png' -printf "put destination/%f %f\n" >> ftp.txt
    echo bye >> ftp.txt
    
    ftp < ftp.txt
    

    以上代码将生成带有命令的文件 ftp.txt 并将其传递给 ftp。生成的 ftp.txt 将如下所示:

    open host
    user user pass
    put destination/forecast1.hrfcst.png forecast1.hrfcst.png
    put destination/forecast2.hrfcst.png forecast2.hrfcst.png
    put destination/forecast3.hrfcst.png forecast3.hrfcst.png
    ...
    bye
    

    【讨论】:

      【解决方案2】:

      以下脚本会将今天添加的所有文件从本地目录上传到远程 ftp 目录。

      #!/bin/bash
      
      HOST='hostname'
      USER='username'
      PASSWD='password'
      
      # Local directory where the files are stored.
      cd "/local/directory/from where to upload files/"
      
      # To get all the files added today only.
      TODAYSFILES=`find -maxdepth 1 -type f -mtime -1`
      
      
      # remote server directory to upload backup
      REMOTEDIR="/directory on remote ftp computer/"
      
      for FILENAME in ${TODAYSFILES[@]}; do
        ftp -n -v $HOST << EOT
        ascii
        user $USER $PASSWD
        prompt
        cd $REMOTEDIR
        put $FILENAME
        bye
        EOT
      done
      

      【讨论】: