只有脚踩上去才知其远近和曲折

【shell脚本】自动备份

自动备份项目要求

  1. 具备配置文件
  2. 每天定时更新,并详细记录日志
  3. 对文件进行压缩
  4. 保留3天的备份数据

配置文件

  1. 包含需要备份的路径形式:path1:path2:path3
  2. 目标目录:打包到安全目录
#filename: .bash.rc
bashup_path=/home/x/code:/home/meng
dest_dir=/date
pre_name=
suffix_name=

日志

时间    操作    对象    在磁盘上的数据增加还是减少,多大
2018-8-16 12:10 backup /home/x/code --> ERROR 权限错误 
2018-8-17 12:10 backup /home/x/code --> home_x_code_2018_8_17.tar.gz +32M
2018-8-17 12:11 delete home_x_code_2018_8_14.tar.gz --> remove -123M

自动备份项目的相关命令

command 新命令 旧命令 给旧命令起个外号

eg:command QQ wq 在vim下QQ也是保存

crontab -e

分 时 日 月 周   用户   参数设定值   参数设定值   指令段

eg:* * * * * bash 路径.sh文件

cut -d "" -f -d用来定义分隔符,默认为tab键-f表示需要取得哪个字段

eg: echo "a/b/c" | cut -d '/' -f 1 执行结果是a

先按/分段,第一个字段是a,第二个字段是b,第三个字段是c-f就是取第几个字段,如果后面的是-f 1-,就是取后一字段c

tar 打包 解压

打包:tar 参数 路径打包后名称 需要打包的名称

解压:tar 参数 路径打包后名称 -C 解压后的路径目录

https://www.cnblogs.com/yhjoker/p/7568680.html

tail -f 根据文件描述符进行追踪,当文件改名或被删除,追踪停止

tr [:] [\n] 替换

. source .source作用一样

echo >> 日志只能追加 原则上不能删除

shell

#!/bin/bash

source ~/project_backup/.backup.rc # .backup.rc里定义了文件路径
TIME_NOW=`date +"%Y-%m-%d %H:%M"` # 现在的时间
TIME_FILE=`date +"%Y_%m_%d_%H_%M"` # 文件的时间

# dest_dir=~/project_backup/backup
# back_dir=$1
# log=~/project_backup/backup.log

if [[ ! -d $dest_dir ]]; then # 如果不是目录报错
    echo "$TIME_NOW [ERROR] The Dest dir $dest_dir not exists" >> $log # 记录日志
    exit
fi

echo "$TIME_NOW backup started!" >> $log # 开始进行打包并记录日志

for i in `echo $back_dir | tr ":" "\n"`; do # 遍历需要打包的文件
    if [[ ! -d $i ]]; then # 如果不是目录报错
        echo "%TIME_NOW backup [ERROR] The dir $i not exists" >> $log
    fi
    echo "$i started"
    target=`echo $i | cut -d "/" -f 2- | tr "/" "_"` # 提取文件名
    target=${target}_${TIME_FILE}.tar.gz # 进行压缩包命名
    tar czPf "${dest_dir}/${target}" $i # 进行打包
    if [[ $? -eq 0 ]]; then # 判断打包是否成功
        for i in `du -h ${dest_dir}/${target}`; do # 记录压缩包占用空间大小
            size=$i
            break
        done
        echo -e "\033[47;34m $TIME_NOW backup $i --> $target +${size} \033[0m" >> $log
    else
        echo "$TIME_NOW [ERROR] Something ..." >> $log
    fi
done

Del_list=`find $dest_dir -name "*.tar.gz" -mtime +3` # 找到三天前的压缩包

for i in $Del_list; do # 删除三天前的压缩包
    for j in `du -h $i`; do
        size=$j
        break
    done
    echo -e "\033[47;34m $TIME_NOW delete $i --> remove -${size} \033[0m" >> $log
    rm -f $i
done
点赞