Forum Programmation.shell Script shell pour purge automatique d'un dossier

Posté par  . Licence CC By‑SA.
Étiquettes :
0
22
nov.
2022

Bonjour à tous,

J'ai créé un script permettant :

  1. Exporter (dump) une base de données PostGre
  2. Compresser sous Zip le "dump"
  3. Synchroniser (export) en Rsync avec un NAS distant le dossier d'exportation

Le tout fonctionne très bien mais, comme j'ai un export/sauvegarde toutes les heures, je me retrouve avec des fichiers compressés de quelques 10 Mo grossissant toutes les heures.
Ce n'est pas encore dérangeant car j'ai un gros disque dur mais je souhaiterais purger les anciennes sauvegardes automatiquement qui ne servent pas à grand chose sauf à prendre de la place.

Le format des fichiers compressés est sous la forme : YYYYmmdd_hhiiss.zip
Est ce que vous connaissez des pistes sur lesquelles je pourrais me baser pour créer mon script ? Je souhaiterais le créer et comprendre plutôt que de faire un bête copier-coller…

Je pensais, à intervalle régulier, (cron) lister les fichiers dans le dossier de synchronisation grâce à stat puis si la date de création est > 4 mois (par exemple) => rm. Est ce que cela pourrait fonctionner ainsi ?

  • # find est ton ami

    Posté par  . Évalué à 4.

    Hello.

    Avec la commande find, les options -mtime (ou -ctime) et -delete, tu devrais trouver ton bonheur.
    Teste sans l'option delete pour la mise au point.

    ++
    Gi)

    • [^] # Re: find est ton ami

      Posté par  . Évalué à 1.

      Merci pour ta réponse.
      J'ai cherché et ai conçu cela (très simple finalement) :

      find $chemin -iname "*.zip" -type f -ctime +180 -maxdepth 1 -exec  rm {} \;
      

      Tu m'indiques que cette commande pourrait fonctionner :

      find $chemin -iname "*.zip" -type f -ctime +180 -maxdepth 1 -delete

      Est ce que cette commande va exécuter ce que je recherche (fichiers zip > 180 jours = poubelle)? (je préfère demander à cause de la commande rm ou delete)

    • [^] # Re: find est ton ami

      Posté par  . Évalué à 1.

      Merci pour ta réponse.
      J'ai cherché et ai conçu cela (très simple finalement) :

      find $chemin -iname "*.zip" -type f -ctime +180 -maxdepth 1 -exec  rm {} \;
      

      Tu m'indiques que cette commande pourrait fonctionner :

      find $chemin -iname "*.zip" -type f -ctime +180 -maxdepth 1 -delete

      Est ce que cette commande va exécuter ce que je recherche (fichiers zip > 180 jours = poubelle)? (je préfère demander à cause de la commande rm ou delete)

  • # Yep

    Posté par  . Évalué à 2. Dernière modification le 22 novembre 2022 à 19:25.

    Cela me semble correct.
    Toutefois, je reitere: teste sans le -delete avant, pour voir si la liste des fichiers renvoyee te semble correcte ;)

    Edit: toutefois, en un mot!

  • # Script

    Posté par  . Évalué à 3.

    Il y a quelques années, j'avais fait un petit script pour gérer nos sauvegardes sur un serveur. Il faudrait certainement changer le parser la date dans le nom du fichier pour que ça fonctionne mais le script permettait de garder toutes les sauvegardes de la semaine, 1 sauvegarde par semaine pour les semaines précédentes la semaine en cours, 1 sauvegarde par mois pour les mois précédents le mois en cours.

    Il y a certainement beaucoup à redire et à améliorer sur l'écrire du script mais de mémoire, c'était fonctionnel.

    #!/bin/bash
    # title     : smartbackupmanagement.sh
    # description   : This program was designed to smartly manage backup files.
    #       It keeps files of the current week then 1 file per week for
    #       the current month and 1 file per month for the current year.
    #       Backup files must have the date in their file names and not
    #       any other numeric character.
    # author    : Nicolas
    # date      : 20140306 initial release
    #       : 20140312 allow spaces in file/path name
    #       : 20140314 files are deleted with OK/NOK echoed
    #           date is extracted from basename
    #       : 20150203 changed command to get last day of the month
    # version   : 0.31
    # usage     : ./smartbackupmanagement.sh
    # notes     :
    # bash_version  : 4.2.10(1)-release
    # TODO      : - do yearly backup management (keep only last backup of the
    #       year
    #============================================================================
    
    # Directory where backup files are stored
    BACKUP_DIRECTORY=$1
    
    # save current date details and delete initial 0 if any
    CURRENT_WEEK=`date +%W | sed 's/^0*//'`
    CURRENT_MONTH=`date +%m | sed 's/^0*//'`
    CURRENT_YEAR=`date +%Y | sed 's/^0*//'`
    
    # Function to check if the date is the last day of the month
    # $1 = year
    # $2 = month
    # $3 = day
    function is_last_day_month
    {
      # find the last day of the month
      last_day=`cal $2 $1 | egrep "28|29|30|31" | fmt -1 | tail -1`
      if [ $3 -eq $last_day ] ; then
        # this is the last day of the month
        return 0
      else
        # remove backup
        return 1
      fi
    }
    
    # Function when weeks are different
    # $1 = file name
    # $2 = day of the week
    function different_weeks
    {
      # check if day of the week is Sunday (day 0)
      if [ $2 -eq 0 ] ; then
        # keep backup of the week
        #echo Keep file as weekly backup
        keep_backup_file "$1"
      else
        # remove backup
        delete_backup_file "$1"
      fi
    }
    
    # Function when months are different
    # $1 = file name
    # $2 = day of the backup
    # $3 = month of the backup
    function different_months
    {
      # check if it's the last day of the month
      if is_last_day_month $CURRENT_YEAR $3 $2 ; then
        # this is the last day of the month
        #echo Keep file as monthly backup
        keep_backup_file "$1"
      else
        # remove backup
        delete_backup_file "$1"
      fi
    }
    
    # Function when years are different
    # TODO
    function different_years
    {
      #echo different years
      :
    }
    
    # Function to keep current file
    function keep_backup_file
    {
      # keep current file
      #echo Keep file $1
      :
    }
    
    # Function to delete current file
    # $1 = filename
    function delete_backup_file
    {
      # delete current file
      #echo "Delete file\t $1"
      rm $1
      if [ $? -eq 0 ]; then echo -e "File deleted\t\t$1"; else echo -e "ERROR file NOT deleted\t$1"; fi
    }
    
    ################
    # Main program #
    ################
    
    echo `date`
    echo Start Smart Backup Management for $BACKUP_DIRECTORY
    
    # for all files in the backup directory
    for backup_file_name in "$BACKUP_DIRECTORY"* ; do
    
      # extract file name without last extension
      backup_file_name_noext=`basename ${backup_file_name%.*}`
    
      # extract date (string) from file name (delete all letters and punctuations)
      backup_file_date_string=`echo "$backup_file_name_noext" | tr -d [:alpha:],[:punct:]`
    
      # convert string into dclearate (not used)
      #backup_file_date_date=`date -d $backup_file_date_string`
    
      # get backup date details
      backup_file_day=`date -d $backup_file_date_string +%d`
      backup_file_week=`date -d $backup_file_date_string +%W`
      backup_file_month=`date -d $backup_file_date_string +%m`
      backup_file_year=`date -d $backup_file_date_string +%Y`
    
      # delete initial 0 if present
      backup_file_day=`echo "$backup_file_day" | sed 's/^0*//'`
      backup_file_week=`echo "$backup_file_week" | sed 's/^0*//'`
      backup_file_month=`echo "$backup_file_month" | sed 's/^0*//'`
    
      if [ $CURRENT_YEAR -eq $backup_file_year ] ; then
        # same year
        if [ $CURRENT_MONTH -eq $backup_file_month ] ; then
          # same month
          if [ $CURRENT_WEEK -eq $backup_file_week ] ; then
            # same week
            #echo Keep this week backups
            keep_backup_file "$backup_file_name"
          else
            # same month, different weeks
            backup_file_day_of_week=`date -d $backup_file_date_string +%w`
            different_weeks "$backup_file_name" $backup_file_day_of_week
          fi
        else
          # same year, different months
          if [ $CURRENT_WEEK -eq $backup_file_week ] ; then
            # different months BUT same week!!!
            #echo Keep this week backups
            keep_backup_file "$backup_file_name"
          else
            # different months, different weeks
            different_months "$backup_file_name" $backup_file_day $backup_file_month
          fi
        fi
      else
        # different years
        different_years
      fi
    done
    
    echo Smart Backup Management finished for $BACKUP_DIRECTORY
    echo `date`
    echo "* * * * * * * * * *"
    
    exit 0
  • # logrotate est ton ami

    Posté par  . Évalué à 8.

    bien que prevu pour les logs, ca marche pour tout type de fichier en fait

    1) c'est installé à peu pres partout
    2) ca prend les fichiers non compressé et ca va les compresser pour toi
    3) ca gere l'effacement dans le temps, par exemple en lui disant que tu veux garder les N derniers

    ainsi tu pourrais avoir le dernier export en clair,
    les N suivants compressés
    les plus anciens sont virés

    • [^] # Re: logrotate est ton ami

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      Ceci dit, l'exercice est intéressant ne serait-ce pour la première raison évoquée (et je me suis déjà retrouvé sur des bécanes sans logrotate, le dernier en date étant un Windows, et juste avant un MacOs)

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.