LINUX.ORG.RU

Переменная количества не удаляемых бэкапов bash

 


0

1

Подскажите переменную которая будет отвечать за количество не удаляемых файлов(бэкапов) в директории. Так как смог найти удаление по дате, времени, а вот по количеству нет. Вот мой скрипт:

#!/bin/bash

TN=test

OF=$TN"$(date +'%Y%b%d-%R')".tar.gz

LOGFILE=/home/user/backup/wplog.log

echo "=====================================================" >>$LOGFILE

echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE

echo "Задание \"$TN\" запущено..." >>$LOGFILE

OLD_IFS=$IFS

IFS=$'\n'

SRCD="/var/www/html/"

TGTD="/home/user/backup/"

tar -czf $TGTD$OF $SRCD &>>$LOGFILE

STATUS=$?

IFS=$OLD_IFS

date


syst_dir=/home/user/backup/


srv_name=bp


srv_ip=127.0.0.1


srv_user=backup


srv_dir="/home/user/backup/$TN"$(date +'%Y%b%d-%R')".tar.gz"

echo "Start backup ${srv_name}"


mkdir -p ${syst_dir}${srv_name}/


find ${syst_dir}${srv_name}/ . -type f -name '*tar.gz' -mmin +1 -delete


rsync -a --delete-after $srv_name@$srv_ip:$srv_dir ${syst_dir}${srv_name}/

date

echo "Finish backup ${srv_name}"

Ответ на: комментарий от vodz

Простите за нелепое оформление. Нужно дописать переменную что устанавливает лимит по бэкапам, тем самым при достижении лимита будут заменены более старые версии бэкапа новыми это должно быть в этой части

# Создаем папку для инкрементных бэкапов

mkdir -p ${syst_dir}${srv_name}/

find ${syst_dir}${srv_name}/ . -type f -name '*tar.gz' -mmin +1 -delete

SysError ()
Ответ на: комментарий от SysError

Основная идея для таких скриптов - find | sort | tail | xargs rm в предположении, что файлы содержат дату в названии в сортируемой форме.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

Можете написать как это должно быть у меня при добавлении этого в мою строку:

find ${syst_dir}${srv_name}/ . -type f -name '*tar.gz' -mmin +1 -delete

SysError ()
Ответ на: комментарий от SysError

Нет, я не могу. Поверьте, если вы делаете самопальную систему бекапов (особенно с удалением копий), то нужно самому и досконально понимать её устройство, иначе её лучше вообще не делать.

legolegs ★★★★★ ()

Кроме уже сказанного могу предложить создавать массив из N элементов - наименований сохраняемых бекапов, а бекапы на удаление проверять на наличие в массиве.

Niroday ()
Ответ на: комментарий от legolegs

По сути у меня все работает, но я не могу найти команду которая делает лимит на допустимые копии. Вот вся проблема. Мне не подходит вариант со временем по бэкапу, нужно лимит в 5 бэкапов и далее заменять старые-новыми. Вот тут я и завис(

SysError ()
Ответ на: комментарий от SysError

У вас действительно файлы во вложенных директориях? Если файлы в текущей директории и нет проблем с спецсиволами в именах (в особенности с пробелами), то отлично сортирует как раз программа «ls», а получить первые 5 штук можно программой «head»

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Так мне не получить нужно 5 файлов, а разрешить делать лишь 5 копий. Сделать это как переменную и при необходимости изменять количество допустимых бэкапов. Простите что возможно запутываю или не корректно доношу, но я пытаюсь разобраться.

SysError ()

man ls, man wc

Но это только в том случае, если ты абсолютно уверен, что у тебя все файлы без пробелов в именах и прочих спецсимволов, иначе ls замена на путь к бекапам, что-то вроде /opt/backups/*

Pyzia ★★★★★ ()
Ответ на: комментарий от Pyzia

Да я уверен что у меня простые имена бэкапов, потому и прошу помочь со строкой переменной.

SysError ()
Ответ на: комментарий от nerve

Огромная благодарность! А можно привязать не по названию удаление?

SysError ()
Ответ на: комментарий от nerve

Проверил работоспособность скрипта. С этой командой он не перезаписывает файлы и в папке уже храниться 5 файлов. Может где то ошибка?

SysError ()
Ответ на: комментарий от SysError

Команда nerve удаляет файлы старше 4 дней. Если вы будете просто не читая запускать все команды, которые видите, то ничего хорошего у вас не получится.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

Я это понимаю, да но я не могу все же найти команды отвечающей за количество файлов, а не удаления их по времени день/час/минута

SysError ()
Ответ на: комментарий от SysError

Проверил работоспособность скрипта.

Ну вы даёте. Вам надо было прочитать man find у увидеть, что это просто другой способ задания временит изменения, то есть ничего принципиально нового не даст.

Так мне не получить нужно 5 файлов, а разрешить делать лишь 5 копий.

А, тогда ls -t | tail +5

vodz ★★★★★ ()
Ответ на: комментарий от legolegs

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

если конечно бекапы делаются по другому расписанию и надо исходить из этого, то вариант выше с датой/временем в имени файлов - самый подходящий.

nerve ★★ ()
Ответ на: комментарий от SysError

Можно пообщаться в скайпе? Я думаю так будет проще.

Не, только по работе от безысходности. Я же вам уже конкретное решение дал. Ну добавьте rm, это я уж думал вы и сами сможете: rm $(ls -t | tail +5)

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Вчера перепробовал много вариантов с вашей командой и не только, но увы оно или оставляло 1 файл либо не было установлено лимита. Да и при тому удаляет все файлы в средине этой папки

SysError ()
Ответ на: комментарий от SysError

Вчера перепробовал много вариантов с вашей командой

Как вы там умудрились получить варианты?

Ну попробуйте не методом магических пассов, а таки разобраться что делает каждая команда, и почему у вас получаются такие результаты. Поймите, человеку не возможно помочь, если он даёт информацию только в стиле «не работает». Можно только взять и выполнить задачу полностью, но такое принято просить в job.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от nerve

Будет держать архивы младше четырёх дней. Если в какой-то из дней бекапов не было, то может получиться меньше.

Если бекапилка сломалась, то через четыре дня архивов не будет совсем.

Radjah ★★★★★ ()
Ответ на: комментарий от Radjah

Если бекапилка сломалась, то через четыре дня архивов не будет совсем.

Самое смешное даже не в том, что ТС хочет вполне объяснимую хорошую логику, а в том, что комментаторы даже не в курсе, что нормальный бекап должен делаться с этой логикой по определению нормальности.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Я перед тем как пробовать перечитал все за что отвечают данные команды, не без этого. Но в итоге получаю такую картину: Срд Фев 7 10:55:07 EET 2018 Start backup tail: невозможно открыть '+5' для чтения: Нет такого файла или каталога cut: неправильная позиция байта/символа «.tar.gz» По команде «cut --help» можно получить дополнительную информацию. find: «rm»: Нет такого файла или каталога Срд Фев 7 10:55:12 EET 2018 Finish backup

SysError ()
Ответ на: комментарий от vodz

Простите вы меня, выдал не ту информацию. Вот что выдает при вашей команде:

Срд Фев 7 11:18:54 EET 2018 Start backup

tail: невозможно открыть '+5' для чтения: Нет такого файла или каталога

Срд Фев 7 11:18:55 EET 2018 Finish backup

SysError ()
Ответ на: комментарий от vodz

tail --version tail (GNU coreutils) 8.25 Copyright (C) 2016 Free Software Foundation, Inc. Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html> Это свободное ПО: вы можете продавать и распространять его. Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

Авторы программы — Paul Rubin, David MacKenzie, Ian Lance Taylor и Jim Meyering.

SysError ()
Ответ на: комментарий от SysError

Сейчас не выдает ошибки, но не чистит файлы в папке.

О боже, Вы толком можете сказать что в результате у вас tail -n +5 делает? Он сам не чистит!

vodz ★★★★★ ()
Ответ на: комментарий от SysError

Вас спрашивают, что в результате делает ваша странная версия tail, а не ваш скрипт полностью, который никто скорее всего полностью и не читал вовсе.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Я разобрался. Из-за того что был убран путь, который перед этим устанавливался в строке которая отвечала за удаление файлов, не происходила чистка. Благодарю за терпение и помощь! С помощью данной комбинации получился желаемый результат.

cd ${syst_dir}${srv_name}/

rm $(ls -t | tail -n +5) -rf

SysError ()
Ответ на: комментарий от vodz

Особенно весело будет, если что-то поменяется и cd не сработает. Рекомендую все скрипты начинать с set -e.

legolegs ★★★★★ ()
Ответ на: комментарий от vodz

А если иметь буду 2 файла бэкапа, то в этом случаи как сохранить баланс копий, что бы замены была 2 старых файлов новыми?

SysError ()
Ответ на: комментарий от SysError

Ну я так думаю, что теоретически, ничего страшного, если сегодня у вас будет 3, а завтра уже баланс на 2 восстановится путём удаления «лишних»?

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Поймите что это лишь тестовый вариант над которым я экспериментирую. Потому тут стоят задачи такого формата. Просто элементарный выход я вижу это ставить парное количество файлов которые допускаю для сохранения. Тем самым соблюдается баланс файлов 2/2 или возможно еще как то прописать что бы именно определенного имени файл заменялся, так как имею название файла и после чего дата.

SysError ()
Ответ на: комментарий от SysError

Но дата же меняется? Как он может заменяться? Если вы знаете дату, ну и удаляйте конкретный файл, а не по количеству.

vodz ★★★★★ ()
Ответ на: комментарий от SysError

Если у вас две сущности, которые вы бекапите, то и складывайте бекапы в отдельные директории. Скрипт так делать проще. Есть директория не просит.

legolegs ★★★★★ ()
Ответ на: комментарий от SysError

он заменяет 2 старых файла httml и wp

И что не так? Вы не хотите, чтобы стирались файлы такого типа? Ну маску к ls добавьте.

vodz ★★★★★ ()
Ответ на: комментарий от legolegs

Если у вас две сущности, которые вы бекапите, то и складывайте бекапы в отдельные директории. Скрипт так делать проще.

Это то я понял, я не пойму, почему его не устраивает просто коррекция номера у tail?

vodz ★★★★★ ()

Простите великодушно,

а чем logrotate не устраивает?

knock ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.