如何删除文件 - 根据文件名中的日期

如何删除文件 - 根据文件名中的日期

我有一些文件夹,里面的文件名称为“example_YY_MM_DD-HH.zip”,我每天有 3 个备份。我需要这个:

1)对于超过 1 周的备份,我每天只需要一次(在 HH 的午夜‘00’)

2)对于超过一个月的备份,我每周只需要一次备份。

3)对于超过一年的备份,我每月只需要一次备份(每月的第一天)

我只有这个,我不知道 IF 部分该放什么。

谢谢

#!/bin/sh
export NOW=$(date +"%d-%m-%Y")
export OUTPUT=/media/backup/logs/delete-old.txt
export BACKUP_DIR=

for file in $BACKUP_DIR
do
if $file

fi
done

答案1

这应该可以工作(如果您设置了正确的完整路径或相对路径,它当前位于目录测试中)

#! /bin/bash

nowday=$(date +"%d")
nowmonth=$(date +"%m")
nowyear=$(date +"%y")

#number of days since 1 Jan 1970 (today)
nowdays=$(($(date --date="20$nowyear-$nowmonth-$nowday" +"%s")/86400))

backup_dir="test/*"
#echo $backup_dir
for file in $backup_dir
do
  hour=${file: -6: -4}
  day=${file: -9: -7}
  month=${file: -12: -10}
  year=${file: -15: -13}
  #number of days since 1 Jan 1970 (file)
  days=$(($(date --date="20$year-$month-$day" +"%s")/86400))
  if ((days < nowdays-365)); then
    # more than one year
    if ((10#$day == 1))&&((10#$hour == 0)); then
      #day is 1 hour is 0 (we keep) use this space if you want to copy or something!
      :
    else
      #Wrong day or hour
      rm $file
    fi
  else if ((days < nowdays-31)); then
    # more than one month (31 days)
    if (((10#$day == 1))||((10#$day == 8))||((10#$day == 15))||((10#$day == 22))||((10#$day == 29)))&&((10#$hour == 0)); then
      #day is 1,8,15,22,29 hour is 0 (we keep) use this space if you want to copy or something!
      :
    else
      #Wrong day or hour
      rm $file
    fi
  else if ((days < nowdays-7)); then
    # more than one week
    if ((10#$hour == 0)); then
      #hour is zero se this space if you want to copy or something!
      :
    else
      #Wrong hour
      rm $file
    fi
  else
    # less than one week (we keep) use this space if you want to copy or something!
    :
  fi fi fi


done

我始终将一个月定义为 31 天,以检查是否超过 1 个月。每周一次,我选择 1、8、15、22 和 29 天,因此始终存在该月的第一天。这也适用于后期目录,因为它会检查每个文件的午夜。

这些:行只是占位符,以防您想在那里放置代码。

在运行所有内容之前先检查一下,以防出现错误!

答案2

看起来这些是实现您所寻找内容的一些方法。

bash 脚本根据文件名中的日期查找旧文件

相关内容