web-dev-qa-db-fra.com

Comment supprimer des fichiers - basé sur la date dans le nom de fichier

J'ai un dossier avec des fichiers dont le nom est "example_YY_MM_DD-HH.Zip" et j'ai 3 sauvegardes par jour. J'ai besoin de ça:

1) Pour les sauvegardes de plus d'une semaine, je n'en ai besoin que d'une par jour (à minuit '00' à HH)

2) Pour les sauvegardes de plus d'un mois, je n'ai besoin que d'une seule sauvegarde par semaine.

3) Pour les sauvegardes de plus d'un an, je n'ai besoin que d'une seule sauvegarde par mois (premier jour du mois)

Je n'ai que cela et je ne sais pas ce qui est mis à la partie IF.

Merci

#!/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
zorbon.cz

Cela devrait fonctionner (si vous définissez le chemin d'accès complet ou relatif correct, il est actuellement sur le test de répertoire)

#! /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

J'ai défini un mois comme 31 jours toujours pour vérifier si plus d'un mois. Pour une fois par semaine, je choisis les jours 1 8 15 22 et 29, donc il y a toujours le premier jour du mois. Cela fonctionne également sur le catalogue arrière car il vérifie minuit pour chaque fichier.

Le : les lignes ne sont que des espaces réservés au cas où vous souhaiteriez y mettre du code.

Vérifiez-le avant de l'exécuter sur tout, juste au cas où il y aurait une erreur!

1
Julian Stirling

Il semble que ce sont des méthodes pour accomplir ce que vous recherchez.

script bash pour rechercher les anciens fichiers en fonction de la date dans le nom du fichier

0
TheHerk