Sauberere Methode zum Löschen von Dateien unter Linux, die einen Datenstempel als Teil des Dateinamens enthalten


8

Ich habe eine neue Anforderung zum Löschen von MySQL-Dump-Dateien, die älter als 30 Tage sind. Die Dateien verwenden die Namenskonvention "all-mysql-YYYYMMDD-HHMM.dump". Die Dateien befinden sich in einem SAN-gemounteten Dateisystem, sodass die Wiederherstellung kein Problem darstellt. Der Speicherplatz auf dem Laufwerk ist jedoch leider begrenzt und füllt sich schnell, sodass häufige menschliche Eingriffe erforderlich sind.

Beispiel für Dateinamen

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

Mein erster Gedanke war, "find" in einem Batch-Skript mit -mtime +30 zu verwenden. Die Änderungszeiten können jedoch nicht garantiert werden und einige der älteren Archive könnten sich dem Löschdatum entziehen :)

Ich habe das folgende BASH-Skript erstellt, aber ich hatte gehofft, dass es eine sauberere Möglichkeit gibt, diesen Vorgang auszuführen.

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

3
Sieht für mich vollkommen angemessen aus, und ich kann keinen einfacheren Weg für die Datumskonvertierung sehen als den, den Sie tatsächlich genommen haben. :)
Tink

@tink - Danke. Ich kann nicht anders, als zu glauben, dass es dafür eine Einzeiler-Lösung gibt. Ich habe mich mehr um andere Betreuer gekümmert, die mehr in JavaLand als in BASHland leben. Vielleicht ist die einzige Sorge das "Jahr 2038" -Problem dann :)
TP

2
Ist das nicht logrotateeine sauberere Lösung?
ott--

2
Für solche Dinge sollte es auch einen Schutz geben (löschen Sie keine alten Backups, wenn aus irgendeinem Grund keine neuen vorhanden sind).
Frostschutz

@ott - Das könnte eine Option sein, wenn es im Userland gut funktioniert. Leider sind uns (App-Ingenieuren) keine Root- oder Su-Berechtigungen gestattet. Wenn also jemand auf Syslog spuckt oder andere Superuser-Privilegien benötigt, sind wir im Dunkeln. Es ist ein Mist, aber es ist die herrschende Politik :(
TP

Antworten:


3

Eine andere Möglichkeit, alle Dateien außer den letzten 30 zu löschen:

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

Oder hier ist eine kürzere Version des Skripts im Originalbeitrag:

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

Option 1 würde keine Zwischensicherungen berücksichtigen, die mehr als 30 Dateien enthalten könnten, aber Option 2 war das, was ich mir erhofft hatte (ein präziseres Skript). Der veröffentlichte Skript-Refactor hat jedoch einen Fehler erzeugt, sodass ich die Datumszuweisungszeile in d = $ (Datum -d @ $ (($ (Datum +% s) -30 * 86400)) +% Y% m% d geändert habe ) und es funktionierte identisch mit dem Skript im ursprünglichen Beitrag.
TP

Datum -d hat unter OS X nicht funktioniert, aber -r scheint auch im Gnu-Datum eine andere Bedeutung zu haben.
Lri

Jep. Ein weiterer GNU gegen BSD gotcha :)
TP

1

Wenn Sie alle außer den letzten 30 Dateien löschen möchten:

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

Dies würde Ihre Anforderung erfüllen, vorausgesetzt, es gibt eine Sicherung pro Tag und das Benennungsschema bleibt unverändert (dh alphabetische Reihenfolge = chronologische Reihenfolge, keine Leerzeichen in Dateinamen).

Sie haben in einem Ihrer Kommentare ausdrücklich einen Einzeiler angefordert. Persönlich schreibe ich gerne mehr auf. Dieser eine Liner ist etwas gefährlich (wenn der Sed ausfällt, wird alles gelöscht).


Derzeit können mehrere Sicherungen (Dumps) pro Tag durchgeführt werden, um die Qualitätssicherung und die lokalen Umgebungen zu aktualisieren. Vielleicht ist es der beste Ansatz, es zu formulieren und auf Nummer sicher zu gehen.
TP

Sie können dann bis zu 40 oder 50 Dateien speichern (wie viele Sie sich auch Speicherplatz leisten können). Wenn Sie ein separates Dateisystem für diese Sicherungen hätten, könnten Sie sogar den freien Speicherplatz angeben und nur die erste Sicherung erstellen, wenn nicht genügend Speicherplatz verfügbar ist.
Frostschutz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.