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



我有一个下面的日志文件谁有日期提到的文件名。我想删除的文件有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")
  • olddayyyyy_mm_dd的格式指定30天前的日期。
  • timestamp重新排列为yyyy_mm_dd
  • 现在我们可以将它们与>运算符进行比较。

如果输出看起来不错,删除echo

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

  • 我们可以使用正则表达式从文件名
  • 中提取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

最新更新