Bash скрипт для удаления старых файлов

Существует много решений в Linux по хранению бэкапов. Есть и готовые решения в виде программ, есть скрипты.
Так уже получилось, что бэкапы складывать в определенную папку задача не сложная (архиватор + cron) но как следить чтобы архивы не плодились? Опять же, есть готовые решения, но я предпочитаю самому управлять процессом. Простой скрип на bash решает проблему удаления старых бэкапов. Например, когда надо, чтобы хранились последние 5 копий, удаляются самые старые файлы бэкапов, а 5 новых остается.
Скрипт не блещет гениальными решениями, более того, я уверен, что это можно было сделать проще, но я как новичок в баше сделал это вот так:

#!/bin/bash

#Проверяем количество входных параметров
if [ $# -lt 3 ]
then
 echo Something wrong with parameters
 exit
fi

x=1  # Счетчик файлов
path=$1 # Путь к удаляемым файлам
filemask=$2 # маска файлов
keep=$3 # сколько файлов (бэкапов) надо оставлять

for i in `ls -t $path/$filemask`
        do
          if [ $x -le $keep ]
                then
                ((x++))
                continue
          fi
        rm $i
  done

Запускаю этот скрипт в кроне раз в неделю, например, с такими параметрами:

/etc/rotate.sh /var/backup/ etc* 3

Это значит что самые старые файлы, начинающиеся с etc в папке /var/backup, кроме трёх самых свежих, будут удалены.

Bash скрипт для удаления старых файлов: 15 комментариев

  1. san пишет:

    san
    14 Апр 2011

    find ${backup_dir} -mtime +8 -type f -exec rm -f {} \;

    Это удалит файлы по времени, а не по количеству. Если надо хранить железно 3 копии, а неделю файлы не обновлялись, то будут удалены все файлы. Я не прав?

  2. Спасибо вам!
    Практически без изменений прикрутил ваш скрипт для автоочистки каталога с дампами базы, дампы сыплются каждые полчаса, а сейчас каждые 5 часов очищаются самые старые. =)

  3. Подскажите какой должен быть код, что бы удалял в папке
    /var/mobile/Media/Papka/
    все файлы кроме 7 последних свежих.
    файлы такие:
    bk_-2012-07:37:41.zip
    bk_-2012-17:37:41.zip
    bk_-2012-27:37:41.zip
    и так далее…

    все перепробовал ничего не работает.
    пожалуйста, если не сложно, можно узнать код именно под мою задачу.
    спасибо!

  4. @ Максим:
    сам скрип указан в статье, а в Вашем случае запускать его вот так:
    /etc/rotate.sh /etc/rotate.sh /var/backup/ etc* 3 bk_*.zip 7

    Будут вопросы, пишите через обратную связь на сайте

  5. Запускаю
    # /etc/rotate.sh /arc/backup1/ etc* 3
    /etc/rotate.sh: Нет соответствий.
    скрипт такой же как и у вас.
    система FreeBSD 9.2
    что не так делаю?

  6. @ Андрей:
    Затрудняюсь ответить, т.к. с FreeBSD мало работал. Может с путями что напутали и онне находит соответствия по маске etc* ?
    Скрипту дали права на выполнение?

  7. Alex пишет:

    @ Максим:
    сам скрип указан в статье, а в Вашем случае запускать его вот так:
    /etc/rotate.sh /etc/rotate.sh /var/backup/ etc* 3 bk_*.zip 7

    Будут вопросы, пишите через обратную связь на сайте

    Вы ему криво посоветовали. У Вас маска etc*, а он просил bk_*, вы ему кинули скрипт не с 3 параметрами, а с 4-мя
    # /etc/rotate.sh /etc/rotate.sh /var/backup/ etc* 3 bk_*.zip 7
    а он тупо сам понять не смог, что у него
    # /etc/rotate.sh /etc/rotate.sh /var/backup/ bk_*.zip 7
    Хотя это и давно было, но хочу поблагодарить за скрипт, довольно симпатичный. Для моих задач прям самое оно. Спасибо.

  8. root@vm1055:~# sh del_old.sh /home/u2django/backups/mysql proslavlenie_db* 3
    : not found 2: del_old.sh:
    del_old.sh: 16: del_old.sh: Syntax error: word unexpected (expecting «do»)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *