2012-03-21 4 views
2

Для сценария резервного копирования мне нужно очистить старые резервные копии. Как сохранить последние резервные копии N и удалить остальные?Резервный сценарий: как сохранить последние N записей?

Резервная копия - это либо одна папка, либо один файл, и сценарий будет либо хранить все резервные копии в папках или файлах (без смешивания).

Если возможно, я хотел бы avoid parsing of the output of ls. Несмотря на то, что все записи в резервной папке должны были быть созданы с помощью сценария резервного копирования, и в именах записей не должно быть смешных символов, хакер мог бы создавать новые записи.

+0

Зачем избегать 'ls'? – kev

+0

@kev http://mywiki.wooledge.org/ParsingLs – jordanm

ответ

1

Это должно сделать это (непроверенных!):

#!/usr/bin/env bash 
set -o errexit -o noclobber -o nounset -o pipefail 
i=0 
max=7 # Could be anything you want 
while IFS= read -r -d '' -u 9 
do 
    let ++i  
    if [ "$i" -gt "$max" ] 
    then 
     rm -- "$REPLY" 
    fi 
done 9< <(find /var/backup -type f -maxdepth 1 -regex '.*/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.tar\.gz' -print0 | sort -rz) 

Разъяснения с внешней стороны:

  1. Убедитесь, что скрипт останавливается на любых распространенных ошибок.
  2. Найти все файлы в/var/backup (и не поддиректории), соответствующих формату YYYY-MM-DD.tar.gz.
  3. Обратный сортировать эти, так что последние перечислены первыми.
  4. Отправьте их в дескриптор файла 9. Это позволяет избежать проблем с cat, ssh или другими программами, которые по умолчанию считывают стандартный ввод.
  5. Чтение файлов по одному из FD 9, разделенных NUL.
  6. Подсчитайте файлы, пока вы не пройдете свой заданный максимум.
  7. Nuke остальные с орбиты.
+0

В моем GNU find regextype по умолчанию - emacs, который не поддерживает \ d для [0-9]. На самом деле, ни один из regextypes в GNU не находит поддержку, которая является всем BRE или ERE. С типом ERE можно использовать [0-9] {4}. – jordanm

+0

@jordanm: Спасибо, исправлено с использованием самого низкого общего знаменателя. '[x] {n}', похоже, не работает для меня. – l0b0

+1

, чтобы он работал, вам нужно что-то вроде '-regextype posix-extended' для использования ERE. – jordanm

Смежные вопросы