bash shell写的图片下载备份定时任务

1 环境

linux centos 7.x

2 背景说明

图片,文件的存储使用的是私有云,但是运维弄了一个多月后,告诉我说由于某些原因他们无法对数据进行备份,让自己想办法处理。
想到的办法是 从mysql 读取使用的图片文件数据,然后下载到服务器进行存储。
mysql 中存储的是图片的地址或者文件名,两种情况都有。

所以最好的办法是 将mysql 存储的图片字段进行处理,获取文件名, 将文件名于路径拼接,获取图片下载地址。

备份策略: 每4小时增量更新一次。

代码说明

获取文件所在的路径,并进入该路径。(个人在写shell, python 时很喜欢这么写,程序执行不容易出现因路径不对问题)

DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
cd $DIR

执行mysql 语句,获取一个表中的两个字段的值,并将返回结果赋值给contract_result (含表头)

contract_result=`/work/install/mysql-5.7.28/bin/mysql -h$host -P$port -u$mysql_u -p$mysql_p car_subsidy -e "${contract_sql}"`

判断以上语句是否成功执行

if [ $? = 0 ] 

去掉数据库返回结果中的表头,并将数据存储到一个临时文件中。

echo "$contract_result"|tail -n +2 > ${f_temp}

循环读取临时文件的数据,

while read line;do
        ((all_count++))
        echo "$all_count"
        arr=(${line})
        #user_id=${arr[0]}
        pic=${arr[1]}
        pic=`echo ${pic}`
        pic=${pic##http*\/}
        if [[ $imgprefix* == $pic ]]
        then
            img_url=${pic}
        else 
            img_url=${imgprefix}${pic}
        fi
        #echo $pic
        #flag=$(`cat $file_contract | grep "${pic}" | wc -l`)
        flag=` grep "${pic}" ${file_out} | wc -l`
        if [ $flag -lt 1 ]
        then
           wget -P ${imgpath} ${img_url}
           ((new_count++))
           echo "${line}" >>  ${file_out}
        fi
    done < ${f_temp}

1 获取数据数组

arr=(${line})

2 去掉 http到 / 之前的字符串

pic=${pic##http*\/}

例如: http:/123455/abcd/xyz.jpg
处理后: xyz.jpg

3 判断字符串包含关系

if [[ $imgprefix* == $pic ]]

pic 是否包含 imgprefix, 即pic 是否以 imgprefix 开头。

4 下载图片到 目录 imgpath。

 wget -P ${imgpath} ${img_url}

5 判断 file_out 文件中是否有 pic 字段。

` grep "${pic}" ${file_out} | wc -l`

定时任务

crontab -e
0 */4 * * *  cd /data/images && sh start.sh

3 完整代码

start.sh

DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
cd $DIR

host=localhost            ####### change  ######
imgpath=img/contract/     ######## change ########
imgprefix=http://obs.example.com.cn/
mysql_u=user
mysql_p=password
port=3306
#d=$(date +%Y-%m-%d %H:%M:%S)
d=$(date +%F#%T)
########### t_purchase_contract  ######################
file_out=recorder ############ change #############
f_temp=${file_out}"_temp" ############ change #############
mysql_table=table            ############ change #############
mysql_field=contract             ############ change #############
contract_sql="select user_id,${mysql_field} from  ${mysql_table}"
contract_result=`/work/install/mysql-5.7.28/bin/mysql -h$host -P$port -u$mysql_u -p$mysql_p car_subsidy -e "${contract_sql}"`
# 判断是否连接成功
new_count=0
all_count=0
img_url=
if [ $? = 0 ] 
then 
    echo "$contract_result"|tail -n +2 > ${f_temp}
    while read line;do
        ((all_count++))
        echo "$all_count"
        arr=(${line})
        #user_id=${arr[0]}
        pic=${arr[1]}
        pic=`echo ${pic}`
        pic=${pic##http*\/}
        if [[ $imgprefix* == $pic ]]
        then
            img_url=${pic}
        else 
            img_url=${imgprefix}${pic}
        fi
        #echo $pic
        #flag=$(`cat $file_contract | grep "${pic}" | wc -l`)
        flag=` grep "${pic}" ${file_out} | wc -l`
        if [ $flag -lt 1 ]
        then
           wget -P ${imgpath} ${img_url}
           ((new_count++))
           echo "${line}" >>  ${file_out}
        fi
    done < ${f_temp}
    echo "${mysql_table} ${mysql_field} finished at ${d},new pics: ${new_count}, all pics: ${all_count}">>log
else
    echo "${mysql_table} ${mysql_field} finished at ${d}, with errors" >> log
fi
rm -rf ${f_temp}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章