1 votes

Comment supprimer des fichiers - sur la base de la date dans le nom du fichier

J'ai un dossier contenant des fichiers dont le nom est "exemple_AAA_MM_DD-HH.zip" et je fais 3 sauvegardes par jour. J'en ai besoin :

1) Pour les sauvegardes de plus d'une semaine, j'ai besoin d'une seule sauvegarde par jour (à minuit '00' à HH).

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

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

Je n'ai que ça et je ne sais pas ce qu'il faut mettre dans 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

1voto

Julian Stirling Points 2831

Ceci devrait fonctionner (si vous définissez le chemin complet ou relatif correct, il se trouve actuellement sur le répertoire test)

#! /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 s'il est supérieur à un mois. Une fois par semaine, je choisis les jours 1 8 15 22 et 29, de sorte qu'il y a toujours le premier jour du mois. Cela fonctionne également sur l'arrière-catalogue car il vérifie le minuit pour chaque fichier.

En : Les lignes sont juste des supports de placement au cas où vous voudriez y mettre du code.

Vérifiez-le avant de le lancer sur tout, au cas où il y aurait une erreur !

0voto

Eko Junaidi Salam Points 155

Il semble que ces méthodes permettent de réaliser ce que vous recherchez.

bash script pour trouver les vieux fichiers en fonction de la date dans le nom du fichier

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X