
请问shell可以自动上传FTP一周内的文件吗
请问shell可以自动上传FTP一周内的文件吗该如何实现在下面的脚本补充一下。谢谢#!/bin/bashftp-n<<!open192.168.1.171usergues...
请问shell可以自动上传FTP一周内的文件吗 该如何实现 在下面的脚本补充一下。谢谢
#!/bin/bash
ftp -n<<!
open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
put a.sh a.sh
close
bye
! 展开
#!/bin/bash
ftp -n<<!
open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
put a.sh a.sh
close
bye
! 展开
1个回答
展开全部
还要循环啊,传入时间参数啊
我最近写了一个FTP自动化下载文件的script,你可以参考下:
#!/bin/sh
#==============================================================================#
# 功能描述:标准输出日志
# 作者:
# 返回值: 输入带当前运行时间的标准格式的日志信息
# 说明:
# 输入 日志信息
#
#
#==============================================================================#
_Msg()
{
v_sTime=`date +"%Y%m%d %H:%M:%S"`
echo "${v_sTime} $1" |tee -a -i ${v_sLogFile}
return 0
}
#==============================================================================#
# 功能描述:休眠
# 作者: Created by PW at 2015/11/11
# 返回值:
# 说明:
# 输入休眠时间
#
#
#==============================================================================#
_Sleep()
{
v_iSleepTime=$1
#if -z 如果字符串为空
if [ -z "${v_iSleepTime}" ]
then
v_iSleepTime=60
fi
sleep ${v_iSleepTime}
}
#==============================================================================#
# 功能描述:断开数据库
# 作者:
# 返回值:
# 说明:
#==============================================================================#
_DBClose()
{
db2 terminate 2>&1 >/dev/null
_Msg " 断开数据库"
return 0
}
#*********************************************主程序******************************#
#初始化参数
#FTP到本机的目录(本机数据存放目录)
v_sTargetPath=/home/almusr/data/odsdata/FTP
#FTP服务器
FTPSERVER=100.0.2.230
#FTP用户和密码
FTPUSER=tomcat
FTPPASSWORD=tomcat
#FTP之前数据存放目录
FTPDIR=/home/tomcat/test
#FTP完成OK标志生成目录和date_record.txt的存放路径
FTPOK_DIR=/home/almusr/data/etl_load/FTPOK
#cd到date_record.txt所在路径下
cd "${FTPOK_DIR}"
#获取时间参数v_sFileDate
v_date=`cat date_record.txt | tail -1`
echo "${v_date}"
#获取加载完成与否的标志Y or N
v_sRunFlag=`echo "${v_date}" | cut "-b10"`
#判断如果是Y就截取加载日期,否则就继续扫描等待
while true
do
if [[ ${v_sRunFlag} = Y ]]; then
#获取加载日期,先截取v_date的前八位,然后再加 1 就是本次加载的数据日期
v_sFileDate_1=`echo "${v_date}" | cut "-b1-8"`
v_sFileDate=`date -d "+1 day ${v_sFileDate_1}" +%Y%m%d`
echo "${v_sFileDate}"
_Msg "DATE:${v_sFileDate}"
#日志路径
v_sLogDir=/home/almusr/log
#日志名字
v_sLogFile="${v_sLogDir}/ftp_${v_sFileDate}/ftp_${v_sFileDate}.log"
#数据文件列表
v_sFtpGetLst="${v_sTargetPath}/${v_sFileDate}/${v_sFileDate}.lst"
_Msg "###########################$FILEDATE###########################"
_Msg "ftp data of ${v_sFileDate}"
#创建日志目录
#-d 如果不存在目录${v_sLogDir}
if [ ! -d "${v_sLogDir}/ftp_${v_sFileDate}" ]
then
#创建日志路径,以日期命名
mkdir -p "${v_sLogDir}/ftp_${v_sFileDate}"
fi
#创建FTP下日期目录
#-d 如果不存在目录${v_sTargetPath}/${v_sFileDate}
if [ ! -d "${v_sTargetPath}/${v_sFileDate}" ]
then
#创建ETL路径,以日期命名
mkdir -p "${v_sTargetPath}/${v_sFileDate}"
fi
#检查日期OK标志是否存在
while true
do
#cd到FTP下的日期目录
cd ${v_sTargetPath}/${v_sFileDate}
if [[ ! -e "${v_sTargetPath}/${v_sFileDate}/${v_sFileDate}_OK.flag" ]]; then
_Msg "Data file is ok and start to get it."
#获取服务器文件名清单
if [ -f "${v_sFtpGetLst}" ]; then
rm -f ${v_sFtpGetLst}
fi
ftp -v -in << DOF
open $FTPSERVER 21
user $FTPUSER $FTPPASSWORD
cd $FTPDIR/${v_sFileDate}
#将该文件夹下所有文件名都写到文件${v_sFtpGetLst}里面
ls *.* ${v_sFtpGetLst}
bye
DOF
#查询文件名清单中是否有 ok标志
v_sEndFlag=`cat "${v_sFtpGetLst}" | grep -i "${v_sFileDate}_OK.flag"`
echo "${v_sEndFlag}"
#if [ -n ${v_sEndFlag} ]如果${v_sEndFlag}非空(非0),返回0(true)
if [[ -n ${v_sEndFlag} && -s ${v_sFtpGetLst} ]];
then
_Msg "Data file is ok and start to get it."
#传输数据文件、产生成功标志文件
_Msg "ftp data file"
if [ ! -d "${v_sTargetPath}/${v_sFileDate}" ]
then
mkdir -p "${v_sTargetPath}/${v_sFileDate}"
else
cd ${v_sTargetPath}/${v_sFileDate}
fi
#cd到FTP目录,FTP过去取数据文件
#cd ${v_sTargetPath}/${v_sFileDate}
ftp -v -in << FOF
open $FTPSERVER 21
user $FTPUSER $FTPPASSWORD
cd $FTPDIR/${v_sFileDate}
binary
mget *.*
bye
FOF
#创建下载完成标志
touch "${FTPOK_DIR}"/${v_sFileDate}.ok
cd "${FTPOK_DIR}"
#将跑数日期和跑数标志(已跑Y,没跑N)写入date_record.txt
echo "${v_sFileDate}|Y" >>date_record.txt
break;
else
_Msg "Data file does not exist, sleep 18000 seconds and then check it again."
sleep 18000
fi
fi
done
exit 0
break;
else
_Sleep "1800"
fi
done
exit 0
#####################################################
我的脚本里面采用了初始txt文本传入初始时间,然后判断是否生成加载标志*.ok文件,再定时扫描,加载完成生成加载完成标志,自动化调脚本可以在linux系统下设置一个定时任务,命令:crontab -l 定时任务列表, crontab -e 定时任务编辑
我最近写了一个FTP自动化下载文件的script,你可以参考下:
#!/bin/sh
#==============================================================================#
# 功能描述:标准输出日志
# 作者:
# 返回值: 输入带当前运行时间的标准格式的日志信息
# 说明:
# 输入 日志信息
#
#
#==============================================================================#
_Msg()
{
v_sTime=`date +"%Y%m%d %H:%M:%S"`
echo "${v_sTime} $1" |tee -a -i ${v_sLogFile}
return 0
}
#==============================================================================#
# 功能描述:休眠
# 作者: Created by PW at 2015/11/11
# 返回值:
# 说明:
# 输入休眠时间
#
#
#==============================================================================#
_Sleep()
{
v_iSleepTime=$1
#if -z 如果字符串为空
if [ -z "${v_iSleepTime}" ]
then
v_iSleepTime=60
fi
sleep ${v_iSleepTime}
}
#==============================================================================#
# 功能描述:断开数据库
# 作者:
# 返回值:
# 说明:
#==============================================================================#
_DBClose()
{
db2 terminate 2>&1 >/dev/null
_Msg " 断开数据库"
return 0
}
#*********************************************主程序******************************#
#初始化参数
#FTP到本机的目录(本机数据存放目录)
v_sTargetPath=/home/almusr/data/odsdata/FTP
#FTP服务器
FTPSERVER=100.0.2.230
#FTP用户和密码
FTPUSER=tomcat
FTPPASSWORD=tomcat
#FTP之前数据存放目录
FTPDIR=/home/tomcat/test
#FTP完成OK标志生成目录和date_record.txt的存放路径
FTPOK_DIR=/home/almusr/data/etl_load/FTPOK
#cd到date_record.txt所在路径下
cd "${FTPOK_DIR}"
#获取时间参数v_sFileDate
v_date=`cat date_record.txt | tail -1`
echo "${v_date}"
#获取加载完成与否的标志Y or N
v_sRunFlag=`echo "${v_date}" | cut "-b10"`
#判断如果是Y就截取加载日期,否则就继续扫描等待
while true
do
if [[ ${v_sRunFlag} = Y ]]; then
#获取加载日期,先截取v_date的前八位,然后再加 1 就是本次加载的数据日期
v_sFileDate_1=`echo "${v_date}" | cut "-b1-8"`
v_sFileDate=`date -d "+1 day ${v_sFileDate_1}" +%Y%m%d`
echo "${v_sFileDate}"
_Msg "DATE:${v_sFileDate}"
#日志路径
v_sLogDir=/home/almusr/log
#日志名字
v_sLogFile="${v_sLogDir}/ftp_${v_sFileDate}/ftp_${v_sFileDate}.log"
#数据文件列表
v_sFtpGetLst="${v_sTargetPath}/${v_sFileDate}/${v_sFileDate}.lst"
_Msg "###########################$FILEDATE###########################"
_Msg "ftp data of ${v_sFileDate}"
#创建日志目录
#-d 如果不存在目录${v_sLogDir}
if [ ! -d "${v_sLogDir}/ftp_${v_sFileDate}" ]
then
#创建日志路径,以日期命名
mkdir -p "${v_sLogDir}/ftp_${v_sFileDate}"
fi
#创建FTP下日期目录
#-d 如果不存在目录${v_sTargetPath}/${v_sFileDate}
if [ ! -d "${v_sTargetPath}/${v_sFileDate}" ]
then
#创建ETL路径,以日期命名
mkdir -p "${v_sTargetPath}/${v_sFileDate}"
fi
#检查日期OK标志是否存在
while true
do
#cd到FTP下的日期目录
cd ${v_sTargetPath}/${v_sFileDate}
if [[ ! -e "${v_sTargetPath}/${v_sFileDate}/${v_sFileDate}_OK.flag" ]]; then
_Msg "Data file is ok and start to get it."
#获取服务器文件名清单
if [ -f "${v_sFtpGetLst}" ]; then
rm -f ${v_sFtpGetLst}
fi
ftp -v -in << DOF
open $FTPSERVER 21
user $FTPUSER $FTPPASSWORD
cd $FTPDIR/${v_sFileDate}
#将该文件夹下所有文件名都写到文件${v_sFtpGetLst}里面
ls *.* ${v_sFtpGetLst}
bye
DOF
#查询文件名清单中是否有 ok标志
v_sEndFlag=`cat "${v_sFtpGetLst}" | grep -i "${v_sFileDate}_OK.flag"`
echo "${v_sEndFlag}"
#if [ -n ${v_sEndFlag} ]如果${v_sEndFlag}非空(非0),返回0(true)
if [[ -n ${v_sEndFlag} && -s ${v_sFtpGetLst} ]];
then
_Msg "Data file is ok and start to get it."
#传输数据文件、产生成功标志文件
_Msg "ftp data file"
if [ ! -d "${v_sTargetPath}/${v_sFileDate}" ]
then
mkdir -p "${v_sTargetPath}/${v_sFileDate}"
else
cd ${v_sTargetPath}/${v_sFileDate}
fi
#cd到FTP目录,FTP过去取数据文件
#cd ${v_sTargetPath}/${v_sFileDate}
ftp -v -in << FOF
open $FTPSERVER 21
user $FTPUSER $FTPPASSWORD
cd $FTPDIR/${v_sFileDate}
binary
mget *.*
bye
FOF
#创建下载完成标志
touch "${FTPOK_DIR}"/${v_sFileDate}.ok
cd "${FTPOK_DIR}"
#将跑数日期和跑数标志(已跑Y,没跑N)写入date_record.txt
echo "${v_sFileDate}|Y" >>date_record.txt
break;
else
_Msg "Data file does not exist, sleep 18000 seconds and then check it again."
sleep 18000
fi
fi
done
exit 0
break;
else
_Sleep "1800"
fi
done
exit 0
#####################################################
我的脚本里面采用了初始txt文本传入初始时间,然后判断是否生成加载标志*.ok文件,再定时扫描,加载完成生成加载完成标志,自动化调脚本可以在linux系统下设置一个定时任务,命令:crontab -l 定时任务列表, crontab -e 定时任务编辑
追问
刚接触linux,你的脚本测试过吗?能不能把你下载的改成上传 谢谢 加分给你
追答
我的脚本都上生产了,肯定测过了啊,你不是核心都写出来了吗上传和下载就是命令不一样,一个是mget或者get,一个是mput和put,其他过程都一样啊,你也可以用一个配置文件(文中date_record.txt)来控制,如果你要再详细的,那我要去写好测一下,本人学习linux和shell才2个礼拜,呵呵,也是菜鸟一枚
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询