Bash 脚本-按日期生成虚假日志文件

126 阅读2分钟

在开发中,有时候需要批量生成一些文件,用于测试~~

我这里的需求是一些日志文件,需要定期清理。读取修改时间,判断是否在时效外,清理掉。

不知道有没有人适用,如果你是好奇进来的,可以看完几个知识点就撤,不浪费时间~

几个知识点

  • Q:为什么不用创建时间? A:在 *nix 系统使用的文件系统中,大部分都不存储创建时间。可以读取到的时间一般有三个。

    • 访问时间,Access timestamp (atime)。 文件最后被访问的时间,例如:打开;

    • 修改时间,Modified timestamp (mtime)。 文件内容变更的时间(包括增、删、改);

    • 变更时间,Change timestamp (ctime)。 不单纯指文件内容的变更,还包括权限的修改等;

      更多内容可以参考:File Timestamps – mtime, ctime and atime in Linux

  • touch 指令可以修改文件的 atime、mtime.

    touch -am -t [[CC]YY]MMDDhhmm[.ss] [文件名]
    

    上述指令为修改指定 [文件名] 的文件的atime、mtime(-am)为 指定时间 [[CC]YY]MMDDhhmm[.ss]。使用[[CC]YY]MMDDhhmm[.ss]替换当前时间。参考:

    • CC 年份前两位(世纪);
      • YY 年份后两位。必填,CC 可选。在 CC 不填的情况下,如果 69 <= YY <= 99, CC 取 19;其他 CC 取 20;
      • MM 月。取 01 到 12;
      • DD 日。取 01 到 31;
      • hh 时。取 00 到 23;
      • mm 分。取 00 到 59;
      • .SS 秒。取 00 到 61,可选;不声明时默认为 0

Source

#!/bin/bash

# author: 一窝鸡尼斯
# date: 2021/08/11
# description:
#   可以用该脚本生成一些假的日志文件
#   使用adb push指令推到目录,进行测试日志的删除功能
#   支持 Mac、Linux
#   Windows 可使用 wsl 执行
#   用法: ./gen_fake_log_files 开始日期 结束日期
#   ./gen_fake_log_files 20220101 20220210
#

#开始日期
if [ -z $1 ]; then
  begin_date="20210711"
else
  begin_date=$1
fi

#结束日期
if [ -z $2 ]; then
  end_date=$(date +%Y%m%d)
else
  end_date=$2
fi

if [ $((begin_date)) -ge $((end_date)) ]; then
  echo "开始日期 $begin_date 不能大于等于 结束日期 $end_date" && exit
fi

# 结束日期取昨天
if [ $(uname) = 'Darwin' ]; then
  end_date=$(date -j -v-1d -f %Y%m%d $end_date +%Y%m%d)
elif [ $(uname) = 'Linux' ]; then
  end_date=$(date -d "$end_date -1 day" +%Y%m%d)
fi

#循环生成所有需要处理的日期
while [ $begin_date -le $end_date ]; do
  #要处理的日期
  if [ $(uname) = 'Darwin' ]; then
    proc_date=$(date -j -f %Y%m%d $begin_date +%Y-%m-%d)
  elif [ $(uname) = 'Linux' ]; then
    proc_date=$(date -d"$begin_date" +%Y-%m-%d)
  fi
  # 文件名 proc_date 格式化 yyyy-MM-dd
  filename="$proc_date.txt"

  # 修改时间
  amTime=""$begin_date"0000.00"
  # 判断文件是否存在,并且修改内容,修改文件的修改时间,模拟老文件

  if [ -e $filename ]; then
    echo '文件 '$filename' 已存在!'
#    echo "$begin_date" >$filename && touch -am -t $amTime $filename
  else
    echo '文件 '$filename' 不存在!'
    echo "$begin_date" >$filename && touch -am -t $amTime $filename
  fi

  # 下一天
  if [ $(uname) = 'Darwin' ]; then
    begin_date=$(date -j -v+1d -f %Y%m%d $begin_date +%Y%m%d)
  elif [ $(uname) = 'Linux' ]; then
    begin_date=$(date -d"$begin_date + 1 day" +%Y%m%d)
  fi
done

测试

  • 脚本已经在Linux(ubuntu、debian:jessie)、 Mac OS X 10.15.6 下测试过;
  • Windows WSL 应该也没问题

如果你手头刚好有Docker环境的话,可以使用这个指令创建测试环境

docker run --name debian_bash -e TZ=Asia/Shanghai \
-v `pwd`:/home/workspace --rm -i -t debian:jessie bash

做测试时,注意时区对生成的文件时间的影响。在不同发行版中,对环境变量 TZ 的支持不一样 有些镜像中,这个 -e TZ=Asia/Shanghai 可能会无效(例如:Ubuntu)

然后执行下列指令,会在目录 /home/workspace 下生成一些 txt 文件(需要的话,可以修改源码 23 行中的文件名)

cd /home/workspace
./gen_fake_log_files.sh 20220101 20220111 

与其感慨路难行,不如马上出发~