Shell脚本:根据输入时间段备份压缩日志文件 -Linux版

本文介绍了一个Shell脚本,该脚本能够根据指定的时间范围和时间间隔,将目标目录内的文件打包成tar归档文件。通过设置起始日期、截止日期及时间间隔等参数,脚本可以灵活地对文件进行归档处理。

Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行

#将所需目录中选中的日期内文件夹打包(tar包) 并按输入时间间隔分段
#1 所需目录
#2 起始日期
#3 截止日期
#4 ---时间间隔(月份)
#5 ---输出目录
#!/bin/bash
input_dir=$1    #第一个参数
date_start=$2   #第二个参数
date_end=$3
#结束日期格式转换
end=$(date +%s -d "${date_end}")
start=$(date +%s -d "${date_start}")
#input split interval
m=3    #时间间隔参数   3:表示每3个月一个压缩包
output_dir="/calogs/test/test2"
echo "===START==="
cd $input_dir
value=$(($end-$start))    #时间相隔天数
#删除操作
while test $value -gt 0
do
  mthago=$(date +%Y%m%d -d "${date_start} ${m} months")
  mthago=$(date +%Y%m%d -d "${mthago} 1 days ago")
  #转换为日期格式
  mthago_time=$(date +%s -d "${mthago}")
  #比较三月后日期是否大于结束日期
  comp1=$(($end-$mthago_time))
  if test $comp1 -le 0
  then
     mthago=$date_end
     #如果小于则赋值为结束日期
     mthago_time=$(date +%s -d "${mthago}")
  fi
  outdir=$output_dir/${input_dir##*/}-$date_start-$mthago.tar   #tar包名称
#  echo $outdir
     if test -f $outdir
     then
        rm -f $outdir
     fi
   date_start=$(date +%Y%m%d -d "${mthago} 1 days ")   #获取开始某日期后一天 1为变量(整数)
   start=$(date +%s -d "${date_start}")     
   value=$(($end-$start))
done
#添加操作
date_start=$2
start=$(date +%s -d "${date_start}")
value=$(($end-$start))
while test $value -ge 0
do
  mthago=$(date +%Y%m%d -d "${date_start} ${m} months")   #获取开始某日期几个月后一天 ${m}为变量(整数)
  mthago=$(date +%Y%m%d -d "${mthago} 1 days ago")
  #转换为日期格式
  mthago_time=$(date +%s -d "${mthago}")
  #比较三月后日期是否大于结束日期
  comp1=$(($end-$mthago_time))
  if test $comp1 -le 0   #$comp1是否小于0
  then
     mthago=$date_end
     #如果小于则赋值为结束日期
     mthago_time=$(date +%s -d "${mthago}")
  fi
  outdir=$output_dir/${input_dir##*/}-$date_start-$mthago.tar
  
  comp2=$(($mthago_time-$start))
 
  while test $comp2 -ge 0   #$comp2是否大于等于0
  do 
     if test -d $date_start
     then
         tar -cf $outdir $date_start    #初次生成tar包
         echo "$outdir"
         date_start=$(date +%Y%m%d -d "${date_start} 1 days ")
         start=$(date +%s -d "${date_start}")
         comp2=$(($mthago_time-$start)) 
         while test $comp2 -ge 0
         do
           if test -d $date_start    #判断文件夹是否存在
           then       
                tar -uf $outdir $date_start    #往tar包中追加文件
                #echo "[ $date_start ]"
           fi
           date_start=$(date +%Y%m%d -d "${date_start} 1 days ")
           start=$(date +%s -d "${date_start}")
           comp2=$(($mthago_time-$start))  
         done
     else         
         date_start=$(date +%Y%m%d -d "${date_start} 1 days ")
         start=$(date +%s -d "${date_start}")
         comp2=$(($mthago_time-$start)) 
     fi  
   done     
   value=$(($end-$start))
done
echo "===FINISHED==="

运行命令(sh文件后跟参数):

sh /calogs/new.sh /calogs/test 20160101 20161230

 

转载于:https://www.cnblogs.com/Allen0603/p/5737184.html

### 使用 Shell 脚本备份日志的最佳实践 在运维工作中,日志备份是一个常见的需求。通过 Shell 脚本实现日志备份不仅可以简化流程,还能确保数据的安全性和一致性。以下是关于如何使用 Shell 脚本完成日志备份的一些最佳实践和示例代码。 #### 1. 日志备份的核心原则 - **时间戳命名**:为了区分不同时间段日志文件,建议在备份文件名中加入当前的时间戳。 - **压缩存储**:原始日志文件可能占用较大的磁盘空间,因此推荐在备份前对其进行压缩处理。 - **周期性清理**:为了避免长期积累导致磁盘满载,应设置合理的保留策略并定期删除过期的备份文件。 - **错误捕获与通知机制**:如果备份过程中发生异常,则需及时记录错误信息并通过邮件或其他方式告知管理员[^3]。 #### 2. 示例代码 下面提供了一个完整的 Shell 脚本来演示如何按照上述原则来执行日志备份: ```bash #!/bin/bash # 定义变量 LOG_DIR="/var/log" # 原始日志目录路径 BACKUP_DIR="/mnt/backups/logs" # 备份目标位置 DATE=$(date +"%Y%m%d%H%M%S") # 获取当前日期作为唯一标识符 MAX_BACKUPS=30 # 设置最多保存多少天的历史副本 # 创建备份目录(如果不存在) if [ ! -d "$BACKUP_DIR" ]; then mkdir -p $BACKUP_DIR || { echo "Failed to create backup directory"; exit 1; } fi # 遍历指定的日志目录并将所有文件打包成单个tar.gz档案 cd $LOG_DIR && tar czf ${BACKUP_DIR}/logs-${DATE}.tgz ./* \ || { echo "Error during archiving logs"; exit 1; } echo "Logs have been successfully backed up at $(date)" # 删除超过设定数量的老本存档 find $BACKUP_DIR -type f -name "*.tgz" | sort -r | tail -n +$(( MAX_BACKUPS + 1 )) | while read file; do rm -rf "${file}" done exit 0 ``` 此脚本完成了以下几个主要功能: - 将 `/var/log` 下的所有日志文件打包到一个新的 `.tgz` 文件中; - 新创建的归档名称包含了精确至秒级的时间标记以便后续检索方便; - 自动移除超出预定义限额之外最旧的一批历史拷贝以释放硬盘资源[^1]。 #### 3. 进一步优化建议 除了基本的日志备份外,还可以考虑增加一些额外特性使整个过程更加健壮可靠: - 添加加密支持保护敏感信息不被未授权访问者获取; - 利用 `rsync` 工具同步本地备份至远程服务器进一步增强灾难恢复能力; - 结合 cron 计划任务安排每天固定时刻触发该脚本运行从而无需人工干预即可维持最新状态[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值