Более чистый способ удаления файлов в Linux, которые включают в себя метку даты как часть имени файла

8

У меня есть новое требование для очистки файлов дампа MySQL старше 30 дней. Файлы используют соглашение об именах "all-mysql-YYYYMMDD-HHMM.dump". Файлы находятся в файловой системе, смонтированной в SAN, поэтому восстановление не представляет проблемы, но, к сожалению, дисковое пространство ограничено и быстро заполняется, что требует частого вмешательства человека.

Пример имен файлов

  • все-MySQL-20130324-2330.dump
  • все-MySQL-20130325-2330.dump
  • все-MySQL-20130326-2330.dump

Моей первой мыслью было использовать «find» внутри пакетного скрипта с параметром -mtime +30, однако время модификации не может быть гарантировано, и некоторые старые архивы могут уклоняться от даты очистки :)

Я создал следующий скрипт BASH, но я надеялся, что есть более чистый способ выполнить эту операцию.

#!/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
источник
3
Выглядит вполне адекватно для меня, и я не вижу более простого способа преобразования даты, чем тот, который вы на самом деле использовали. :)
Тинк
@tink - Спасибо. Не могу не думать, что для этого было решение с одним вкладышем. Меня больше интересовали другие сопровождающие, которые живут больше на JavaLand, чем на BASHland. Возможно, единственная проблема - это проблема "Год 2038" :)
TP
2
Разве это не logrotateболее чистое решение?
ott--
2
Для подобных вещей должна быть защита (не удаляйте старые резервные копии, если по какой-то причине нет новых).
frostschutz
@ott - Это может быть вариант, если он хорошо работает в пользовательском пространстве. К сожалению, нам (разработчикам приложений) не разрешены какие-либо привилегии root или su, поэтому, если кто-то выплескивается в системный журнал или требует каких-либо других привилегий суперпользователя, мы будем в неведении. Это облом, но это правящая политика :(
TP

Ответы:

3

Еще один способ удалить все, кроме последних 30 файлов:

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

Или вот более короткая версия скрипта в оригинальном посте:

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
источник
Вариант 1 не учитывает временные резервные копии, которые могут содержать более 30 файлов, но вариант 2 был тем, чего я надеялся достичь (более сжатый сценарий). Однако опубликованный скрипт рефакторинга действительно выдал ошибку, поэтому я изменил строку назначения даты на d = $ (date -d @ $ (($ (date +% s) -30 * 86400)) +% Y% m% d ) и он работал идентично сценарию в оригинальном посте.
TP
date -d не работает на OS X, но -r также имеет другое значение в дате gnu.
Lri
Ага. Другой GNU против BSD попался :)
TP
1

Если вы хотите удалить все, кроме последних 30 файлов:

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

Это будет соответствовать вашему требованию при условии, что существует одна резервная копия в день, и схема именования остается неизменной (т. Е. Алфавитный порядок = хронологический порядок, без пробелов в именах файлов).

Вы специально запросили однострочник в одном из ваших комментариев. Лично мне нравится больше писать. Этот лайнер немного опасен (если sed не работает, все удаляется).

frostschutz
источник
В настоящее время может быть несколько резервных копий (дампов) в день для обновления контроля качества и локальных сред. Может быть, это лучше всего описать и играть безопасно.
TP
Тогда вы можете увеличить его до 40 или 50 файлов (сколь угодно много вы можете себе позволить). Если бы у вас была отдельная файловая система для этих резервных копий, вы могли бы даже определить свободное место и запоминать только первую резервную копию, когда недостаточно места.
frostschutz