咱们可能会遇到这种场景,在某个机构订阅了一个邮件列表,而后这个机构会按期的发送带有ftp目录的url地址到你的邮件,如今你想在你的服务器上可以方便的下载这个列表上的文件,而不是手动的一个个去下,那么咱们能够用脚原本完成这个功能,我将这个过程分为两部分,第一步获取到ftp页面的全部文件名称,第二步是经过得到的文件名来下载文件浏览器
下面以一个卫星数据的下载为例:bash
ftp://oceans.gsfc.nasa.gov/subscriptions/1227这个是邮件中收到的url地址,在浏览器中能够查看到文件名,因为这个数据是0,这个是这样设计的,服务器
第一步:咱们只须要获取他的文件名,用下面这个脚本优化
#! /bin/shurl
echo "请输入你的FTP目录编号"spa
read -e id设计
wget -r ftp://oceans.gsfc.nasa.gov/subscriptions/$idip
ls /usr/src/oceans.gsfc.nasa.gov/subscriptions/$id/ > /usr/src/filename.txtci
这样文件名就被下载到了/usr/src/filename.txt中了get
第二步:提取文件名下载数据
#! /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