删除shell脚本中日志文件名中有30天时间戳的日志文件

l3zydbqr  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(128)

我有一个下面的日志文件谁有日期提到的文件名。我想删除的文件有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

我试过下面
find /path/to/files/ -type f -name "*_*_*_$2022.log" -mtime +30 -delete,但它会根据文件时间戳删除文件。

h43kikqp

h43kikqp1#

假设:

  • 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

tzcvj98z

tzcvj98z2#

如果我理解时间戳只在文件名中给出。

  • 我们可以使用regex从文件名中提取dd_mm_yyyy组件
  • 我们可以将其重新排列为yyyymmdd
  • 然后,我们可以使用yyyymmdd将其转换为相对于以秒为单位的纪元日期的秒数(使用date +%s
  • 我们还可以使用date +%s获得今天相对于相同纪元日期的日期(以秒为单位
  • 然后,我们可以简单地减去这两个日期,并将单位从秒改为天
  • 如果天数小于30,则不删除

代码如下:

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

相关问题