我有一个下面的日志文件谁有日期提到的文件名。我想删除的文件有30天前的日期在文件名。请有人提供解决方案。
日志文件: -
fortinetPerformanceMet_01_11_2022.log
fortinetTokenGeneration_05_11_2022.log
fortinetTopDestination_10_12_2022.log
fortinetTopSource_11_12_2022.log
我想删除一个日志文件谁有30天前的日期在文件名。删除30天前的文件后,上述文件的预期输出将为
fortinetTopDestination_10_12_2022.log
fortinetTopSource_11_12_2022.log
I tried below
find /path/to/files/ -type f -name "*_*_*_$2022.log" -mtime +30 -delete
,但它会根据文件时间戳删除文件。
假设:
- 您的
date
命令支持-d
选项 - 文件名中的时间戳代表
dd_mm_yyyy
。
那么请你试试:
#!/bin/bash
oldday=$(LC_TIME=C date -d "-30 days" "+%Y_%m_%d")
while IFS= read -r f; do
if [[ $f =~ _([0-9]{2})_([0-9]{2})_([0-9]{4}).log ]]; then
timestamp="${BASH_REMATCH[3]}_${BASH_REMATCH[2]}_${BASH_REMATCH[1]}"
if [[ $oldday > $timestamp ]]; then
echo rm -- "$f"
fi
fi
done < <(find /path/to/files/ -type f -name "*_*_*_*.log")
oldday
以yyyy_mm_dd
的格式指定30天前的日期。timestamp
重新排列为yyyy_mm_dd
。 现在我们可以将它们与
>
运算符进行比较。如果输出看起来不错,删除echo
。
如果我理解的话,时间戳只在文件名中给出。
- 我们可以使用正则表达式从文件名 中提取
- 我们可以将其重新排列为
yyyymmdd
格式 然后我们可以使用 - 我们还可以使用
date +%s
以秒为单位获得今天相对于同一历元日期的日期 - 然后我们可以简单地减去两个日期,并将单位从秒改为天
- 如果天数小于30天,我们不删除
dd_mm_yyyy
组件。yyyymmdd
将其转换为相对于纪元日期的秒,使用date +%s
代码如下:
now=$(date +%s)
for f in $(find . -type f -name "*_*_*.log")
do
if [[ $f =~ _([0-9]{2})_([0-9]{2})_([0-9]{4}).log ]]; then
yyyymmdd=${BASH_REMATCH[3]}${BASH_REMATCH[2]}${BASH_REMATCH[1]}
old=$(date +%s -d $yyyymmdd)
((age = (now -old) / 60 / 60 / 24))
echo "file: $f age: $age"
if (( age < 30 )); then continue; fi
echo delete $f
# rm $f # UNCOMMENT WHEN YOU'RE HAPPY
fi
done
对于示例数据,上面的脚本输出:
file: ./fortinetPerformanceMet_01_11_2022.log age: 41
delete ./fortinetPerformanceMet_01_11_2022.log
file: ./fortinetTopDestination_10_12_2022.log age: 2
file: ./fortinetTopSource_11_12_2022.log age: 1
file: ./fortinetTokenGeneration_05_11_2022.log age: 37
delete ./fortinetTokenGeneration_05_11_2022.log