利用脚本自动下载ftp列表中的文件

我们可能会遇到这种场景,在某个机构订阅了一个邮件列表,然后这个机构会定期的发送带有ftp目录的url地址到你的邮件,现在你想在你的服务器上能够方便的下载这个列表上的文件,而不是手动的一个个去下,那么我们可以用脚本来完成这个功能,我将这个过程分为两部分,第一步获取到ftp页面的所有文件名称,第二步是通过获得的文件名来下载文件
下面以一个卫星数据的下载为例:

ftp://oceans.gsfc.nasa.gov/subscriptions/1227

这个是邮件中收到的url地址,在浏览器中可以查看到文件名,由于这个数据是0,这个是这样设计的.

第一步:我们只需要获取他的文件名,用下面这个脚本

#! /bin/sh
echo "请输入你的FTP目录编号"
read -e id
wget -r  ftp://oceans.gsfc.nasa.gov/subscriptions/$id
ls  /usr/src/oceans.gsfc.nasa.gov/subscriptions/$id/ > /usr/src/filename.txt

这样文件名就被下载到了/usr/src/filename.txt中了

第二步:提取文件名下载数据

#! /bin/sh
a=$(cat /usr/src/filename.txt |wc -l)
echo "请输入你要下载的文件的存放路径"
read -e dir
mkdir -p $dir
cd $dir
for((i=1;i<=a;i++))
do
b=$( head -$i /usr/src/filename.txt |tail -1)
wget -T 20 -c -t 0 http://oceandata.sci.gsfc.nasa.gov/cgi/getfile/$b
done

这样数据就被下载到指定位子了


上面是功能的分块实现,下面对脚本进行了优化:

#!/bin/bash
input=
until
 echo "----------------------------------"
 echo "您想做下列哪项操作"
 echo "(1) 获取指定目录文件名(需知道目录编号)"
 echo "(2) 请输入你要下载的FTP目录编号"
 echo "(3) 检查文件是否下载完整,需指定目录编号:"
 echo "(4) 不做操作退出"
 echo "----------------------------------"
 read -e input                   #读入用户输入的内容,并存入变量
 test $input -eq 4               #若输入为4,则退出,否则继续
 do
  case $input in                 #开始CASE  IN  CASE结构
 1)
        echo "请输入你的FTP目录编号"
        read -e id
        wget -r -T 20 -t 0 ftp://oceans.gsfc.nasa.gov/subscriptions/$id
        ls  /usr/src/oceans.gsfc.nasa.gov/subscriptions/$id/ > /usr/src/filename$id.txt;;
 2)
        echo "请输入你要下载的FTP目录编号"
        read -e id1
        a=$(cat /usr/src/filename$id1.txt |wc -l)
        echo "有 $a 个 文件"
        echo "请输入你要下载的文件的存放路径"
        read -e dir
        mkdir -p $dir
        cd $dir
        for((i=1;i<=a;i++))
        do
        b=$( head -$i /usr/src/filename$id1.txt |tail -1)
        wget  -c -t 0 -T 20  http://oceandata.sci.gsfc.nasa.gov/cgi/getfile/$b
        done
   ;;
 3)
        echo "请输入你要检查的FTP目录编号"      
        read -e id2
        echo "请输入你存放这个目录编号文件的存放路径"
        read -e dir1
        c=$(ls $dir1 |wc -l)
        d=$(cat /usr/src/filename$id2.txt |wc -l)
        echo "你希望下载的文件数目是$d"
        echo "你实际下载的文件数目是$c"
        ;;
        esac                    #结束CASE结构
  done

写于: 2012年01月18日
更新于: 2015年03月22日