./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