在开发中,有时候需要批量生成一些文件,用于测试~~
我这里的需求是一些日志文件,需要定期清理。读取修改时间,判断是否在时效外,清理掉。
不知道有没有人适用,如果你是好奇进来的,可以看完几个知识点就撤,不浪费时间~
几个知识点
-
Q:为什么不用创建时间? A:在 *nix 系统使用的文件系统中,大部分都不存储创建时间。可以读取到的时间一般有三个。
-
访问时间,Access timestamp (atime)。 文件最后被访问的时间,例如:打开;
-
修改时间,Modified timestamp (mtime)。 文件内容变更的时间(包括增、删、改);
-
变更时间,Change timestamp (ctime)。 不单纯指文件内容的变更,还包括权限的修改等;
-
-
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
- CC 年份前两位(世纪);
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
与其感慨路难行,不如马上出发~