Un moyen plus propre de supprimer des fichiers sous Linux qui incluent un horodatage dans le nom de fichier

8

J'ai une nouvelle exigence pour purger les fichiers de vidage MySQL datant de plus de 30 jours. Les fichiers utilisent une convention de dénomination "all-mysql-YYYYMMDD-HHMM.dump". Les fichiers sont situés sur un système de fichiers monté sur SAN, donc la restauration n'est pas un problème, mais l'espace disque est malheureusement limité et se remplit rapidement, ce qui nécessite une intervention humaine fréquente.

Exemple de noms de fichiers

  • all-mysql-20130324-2330.dump
  • all-mysql-20130325-2330.dump
  • all-mysql-20130326-2330.dump

Ma première pensée a été d'utiliser "find" dans un script batch avec -mtime +30, cependant, les temps de modification ne peuvent pas être garantis et certaines des anciennes archives pourraient échapper à la date de purge :)

J'ai créé le script BASH suivant, mais j'espérais qu'il y avait un moyen plus propre d'effectuer cette opération.

#!/bin/bash

STARTING_DIR=$(pwd)

FILE_PREFIX=all-mysql-
BACKUP_DIR=/opt/backup/mysql/dumps
ARCHIVE_WINDOW_DAYS=30

cd $BACKUP_DIR

# Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS
ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc)
PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d)

for backup_file in $FILE_PREFIX*
do
    # Trim prefix, time portion of date stamp, and file extension
    # from $backup_file to allow numeric comparison against YYYYMMDD
    backup_trim_tmp=${backup_file#${FILE_PREFIX}}
    backup_trimmed=${backup_trim_tmp%-****.dump}

    if [ ${PURGE_BEFORE_DATE} -gt ${backup_trimmed} ]
    then
        rm $backup_file
    fi
done

cd $STARTING_DIR
TP
la source
3
Cela me semble parfaitement adéquat et je ne vois pas de méthode de conversion de date plus simple que celle que vous avez réellement prise. :)
tink
@tink - Merci. Je ne peux pas m'empêcher de penser qu'il y avait une solution à un revêtement pour cela. J'étais plus préoccupé par les autres mainteneurs qui vivent plus dans JavaLand que BASHland. Peut-être que le seul problème est le problème de "l'année 2038" alors :)
TP
2
N'est-ce pas logrotateune solution plus propre?
ott--
2
Pour des choses comme celles-ci, il devrait également y avoir une sauvegarde (ne supprimez pas les anciennes sauvegardes quand, pour une raison quelconque, il n'y en a pas de nouvelles).
frostschutz
@ott - Cela pourrait être une option si cela fonctionne bien dans l'espace utilisateur. Malheureusement, nous (les ingénieurs d'application) ne sommes pas autorisés à avoir des privilèges root ou su, donc si quelqu'un crache sur syslog ou nécessite d'autres privilèges de superutilisateur, nous serons dans l'ignorance. C'est une déception mais c'est la politique en vigueur :(
TP

Réponses:

3

Une autre façon de supprimer tout sauf les 30 derniers fichiers:

rm $(ls -r | tail -n +31)

Ou voici une version plus courte du script dans le post original:

cd /opt/backup/mysql/dumps
d=$(date -r $(($(date +%s)-30*86400)) +%Y%m%d)
for f in all-mysql-*; do
    [[ ${f#all-mysql-} < $d ]] && rm $f
done
Lri
la source
L'option 1 ne prendrait pas en compte les sauvegardes intermédiaires pouvant entraîner plus de 30 fichiers, mais l'option 2 était ce que j'espérais réaliser (un script plus concis). Cependant, le refactoriseur de script publié a produit une erreur, j'ai donc modifié la ligne d'affectation de date en d = $ (date -d @ $ (($ (date +% s) -30 * 86400)) +% Y% m% d ) et cela a fonctionné de manière identique au script dans le message d'origine.
TP
date -d ne fonctionnait pas sur OS X, mais -r semble également avoir une signification différente dans la date gnu.
Lri
Ouaip. Un autre GNU vs BSD gotcha :)
TP
1

Si vous souhaitez supprimer tout sauf les 30 derniers fichiers:

rm `echo " " all-mysql-*.dump | sed -r -e 's/( [^ ]+){0,30}$//'`

Cela répondrait à vos besoins à condition qu'il y ait une sauvegarde par jour et que le schéma de dénomination reste tel qu'il est (par exemple, ordre alphabétique = ordre chronologique, pas d'espace dans les noms de fichiers).

Vous avez spécifiquement demandé un one-liner dans l'un de vos commentaires. Personnellement, j'aime mieux écrire les choses. Cette doublure est un peu dangereuse (si le sed échoue, tout est supprimé).

frostschutz
la source
Actuellement, il peut y avoir plusieurs sauvegardes (vidages) par jour pour actualiser le contrôle qualité et les environnements locaux. Peut-être que le préciser et jouer en toute sécurité est la meilleure approche.
TP
Vous pouvez alors monter jusqu'à 40 ou 50 fichiers (même si vous pouvez vous permettre de l'espace de stockage). Si vous aviez un système de fichiers distinct pour ces sauvegardes, vous pourriez même statiser l'espace libre et rm uniquement la première sauvegarde lorsque l'espace disponible est insuffisant.
frostschutz