S3cmd переместить файл и удалить папку

Я пытаюсь написать сценарий bash для автоматизации моего плана резервного копирования. Я использую скрипт, который каждый день создает папку S3 с днем ​​в качестве имени папки. И Каждый час он заливает бэкап в эту папку. пример: /Application1/20130513/dump.01

Мой план резервного копирования состоит в том, чтобы хранить 2 дня полного резервного копирования (каждый час) и хранить 1 резервную копию в день в течение последних 15 дней в папке s3 («oldbackup»).

Что не так в моем сценарии?

#check and clean the S3 bucket
BUCKETNAME='application1';
FOLDERLIST = s3cmd ls s3://$BUCKETNAME
LIMITFOLDER = date --date='1 days ago' +'%Y%m%d'

for f in $FOLDERLIST
do
    if [[ ${f} > $LIMITFOLDER && f != "oldbackup" ]]; then
        s3cmd sync s3://$BUCKETNAME/$f/dump.rdb.0 s3://$BUCKETNAME/"oldbackup"/dump.rdb.$f
        s3cmd del s3://$BUCKETNAME/$f --recursive;
    fi
done

OLDBACKUP = s3cmd ls s3://$BUCKETNAME/"oldbackup"
LIMITOLDBACKUP = date --date='14 days ago' +'%Y%m%d'
for dump in $OLDBACKUP
    if [${dump} > $LIMITOLDBACKUP]; then
                s3cmd del s3://$BUCKETNAME/"oldbackup"/$dump
    fi
done

Спасибо


person Matt    schedule 13.05.2013    source источник


Ответы (1)


Во-первых, вы, вероятно, захотите сохранить FOLDERLIST в виде массива. Вы можете сделать это следующим образом: FOLDERLIST=($(command)).

Затем вы всегда должны сохранять вывод команд, которые вы собираетесь использовать, в виде строки, например OUTPUT="$(command)".

Так, например, ваши первые три строки должны выглядеть так:

BUCKETNAME="application1"
FOLDERLIST=($(s3cmd ls s3://$BUCKETNAME))
LIMITFOLDER="$(date --date="1 days ago" +"%Y%m%d")"

Теперь ваш первый цикл for должен работать.

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

В вашем втором цикле for (помимо того, что он не повторяет правильный массив) нет ключевого слова do, поэтому вы должны сделать:

for dump in $OLDBACKUP
do
   # rest of loop body
done

Это может быть еще одна проблема с вашим сценарием.

Наконец, вы используете только OLDBACKUP и FOLDERLIST для повторения. То же самое можно сделать, просто выполнив:

for f in $(s3cmd ls s3://$BUCKETNAME)
do
  # loop body
done

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


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

person Ian Stapleton Cordasco    schedule 13.05.2013