linux脚本指定目录下文件,逐个上传ftp服务器

 ./upload.sh 20190801 >> logfile.txt 2>&1

脚本内容:

#!/bin/bash -e

#配置信息
USER=xxx
PASS=xxx
HOST=xxx
PORT=21
ZIPSecret=lsx123

#传参提示
if [ "$1" == "-h" ];then
    echo
    echo "USAGE: $0 date[YYYYMMDD]"
    echo
    exit 1
fi


#逐个文件上传
#以天为单位,传递日期,如果默认不传,则为前一天的数据
yesterday=$(date -d "1 day ago" "+%Y%m%d")

uploadDir=/home/lsx/
srcDir=/home/lsx/src1/
localLog_Dir=/home/lsx/logs/
localLog_Flag_Dir=/home/lsx/logs/flag/

EXECUTE_DAY=""
EXECUTE_YEAR=""
#未指定日期
if [ ! -n "$1" ] ;then
        last_day=`head -1 $uploadDir/commit_log.cmt`
	if [ ! -n "$last_day" ] ;then 
		echo commit_log.cmt文件为空(还未上传),未指定日期,下面默认开始上传昨天的数据.
		yesterday=$(date -d "1 day ago" "+%Y%m%d")
		EXECUTE_YEAR=$(date -d $yesterday  "+%Y")
	        EXECUTE_DAY=$(date -d $yesterday "+%m%d")
		

        else
		echo  commit_log 记录的最后上传的文件日期是:  $last_day  接着上传下一天数据
		next_day=$(date -d "$last_day 1 day" "+%Y%m%d")
		EXECUTE_YEAR=$(date -d $next_day  "+%Y")
	        EXECUTE_DAY=$(date -d $next_day "+%m%d")
		
        fi		
#指定日期
else
        day=$1
        EXECUTE_YEAR=$(date -d $day  "+%Y")
	EXECUTE_DAY=$(date -d $day "+%m%d")
	
fi


srcDir=$srcDir/$EXECUTE_YEAR/$EXECUTE_DAY/
if [ !  -d $srcDir ];then
	echo 目录:$srcDir 源目录不存在,退出程序.
        exit
fi
#从参数获取待上传文件路径,此目录下只存放xx.zip文件
localLog_Dir=$localLog_Dir/$EXECUTE_YEAR/$EXECUTE_DAY/

echo "从源文件--》zip文件:"  $localLog_Dir

if [  -d $localLog_Dir ];then
	echo 目录:$localLog_Dir 已存在,执行删除并重新压缩文件
	rm -r $localLog_Dir
fi

for module in `ls $srcDir`
do 
	echo module: $module
	mkdir -p $localLog_Dir/$module
	cd $localLog_Dir/$module
	i=1
	for unzipfile in `ls $srcDir/$module`
	do
		filename=`echo ${i}|awk '{printf("%02d\n",$0)}'`
                zip --password $ZIPSecret $localLog_Dir/$module/$filename.zip $srcDir/$module/$unzipfile
		#zip dd.zip aaa.txt
                let i=i+1
	done

done

echo "从压缩文件开始上传至ftp服务器"
#只存放标识数据 此目录即时创建
localLog_Flag_Dir=$localLog_Flag_Dir/$EXECUTE_YEAR/$EXECUTE_DAY/
if [  -d $localLog_Flag_Dir ];then
	echo 目录:$localLog_Flag_Dir 已存在,执行删除并重新创建目录
	rm -r $localLog_Flag_Dir
fi
mkdir  -p $localLog_Flag_Dir
#创建远程目录 月日  这里不能创建级联目录 ,只能一层层创建
ftp -n -v  << EOF
	open $HOST $PORT
	user $USER $PASS
	mkdir $EXECUTE_YEAR
	cd $EXECUTE_YEAR
	mkdir $EXECUTE_DAY
        bye
EOF

#该路径下有cdn,listen,download,click,action 5个子目录
#开始逐个遍历,注意这里开始(至少从这一层开始目录结构和remote要保持一致,不包含filelist,filecomplete)
for module in `ls $localLog_Dir`
do
       echo module: $module
       mkdir $localLog_Flag_Dir/$module
       ftp_mkdir_module=`ftp -n -v  << EOF
                            open $HOST $PORT	
                            user $USER $PASS 
                            cd $EXECUTE_YEAR/$EXECUTE_DAY/
                            mkdir $module
                            bye 
EOF`
       for upfile in `ls $localLog_Dir/$module`
       do
		echo upfile:$upfile   
		#开始逐个上传文件$localLog_Dir/$module/$upfile
                ftp_uplog=`ftp -n -v  << EOF
				passive
				open $HOST $PORT
				user $USER $PASS
				binary
				cd /$EXECUTE_YEAR/$EXECUTE_DAY/$module
				lcd /$localLog_Dir/$module
				put $upfile		
                                bye
EOF`
	        #上传后本地文件中增加一个filelist ,这个文件和上传文件分开目录存储
		cd /$localLog_Flag_Dir/$module
		echo $upfile >> filename.list
                ftp_update_fllelist=`ftp -n -v  << EOF
				 	passive
					open $HOST $PORT
					user $USER $PASS
					binary
					cd /$EXECUTE_YEAR/$EXECUTE_DAY/$module
					lcd /$localLog_Flag_Dir/$module
					put filename.list		
					bye
EOF`
       done
       #每个模块遍历上传后,再增加一个完成标识
       cd /$localLog_Flag_Dir/$module
       touch complete.file
       ftp_up_complete=`ftp -n -v  << EOF
				passive
				open $HOST $PORT
				user $USER $PASS
				cd /$EXECUTE_YEAR/$EXECUTE_DAY/$module
				lcd /$localLog_Flag_Dir/$module
				put complete.file	
				bye
EOF`     
done
echo $EXECUTE_YEAR$EXECUTE_DAY>/$uploadDir/commit_log.cmt
echo "success.."

涉及的知识点总结

1 日期格式化处理

next_day=$(date -d "$last_day 1 day" "+%Y%m%d")

2 如何将数字按照指定长度输出

filename=`echo ${i}|awk '{printf("%02d\n",$0)}'`

3如何加密形式压缩文件

注意:在shell脚本,即便上面cd到了文件的目录,这里也必须写绝对路径,否则报错

  zip --password $ZIPSecret $localLog_Dir/$module/$filename.zip $srcDir/$module/$unzipfile

4如何判断指定字符串是否为空

 if [ ! -n "$last_day" ] ;then
  ... #为空时
fi

5 如何判断指定目录是否存在

if [ !  -d $srcDir ];then
        echo 目录:$srcDir 源目录不存在,退出程序.
        exit
fi

6 如何在shell脚本里连接ftp服务器

ftp -n -v  << EOF
        open $HOST $PORT
        user $USER $PASS
        mkdir $EXECUTE_YEAR
        cd $EXECUTE_YEAR
        mkdir $EXECUTE_DAY
        bye
EOF

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值