阅读文件列表,然后通过 FTP 发送这些文件
Reading Through A List of Files, then Sending those Files via FTP
我正在使用 Grads 脚本语言制作天气模型图表,我正在使用 bash 脚本,因此我可以使用 while 循环下载模型数据(grib2 格式)并调用 grads 脚本模型上的每一帧 运行。现在,我有一个循环 运行 遍历给定预报小时的所有脚本,并通过 FTP 上传图像输出。这个for循环完成后,下载下一个小时的grib2数据,再循环运行s
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 脚本读取并发送所有这些文件一个会话。这可能吗?
有可能。您可以将其添加到 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
以下脚本会将今天添加的所有文件从本地目录上传到远程 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
我正在使用 Grads 脚本语言制作天气模型图表,我正在使用 bash 脚本,因此我可以使用 while 循环下载模型数据(grib2 格式)并调用 grads 脚本模型上的每一帧 运行。现在,我有一个循环 运行 遍历给定预报小时的所有脚本,并通过 FTP 上传图像输出。这个for循环完成后,下载下一个小时的grib2数据,再循环运行s
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 脚本读取并发送所有这些文件一个会话。这可能吗?
有可能。您可以将其添加到 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
以下脚本会将今天添加的所有文件从本地目录上传到远程 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