У меня есть сценарий оболочки, работающий в AIX, который каждую ночь будет делать резервную копию каждого репозитория SVN. Выполнение выглядит следующим образом:
Загрузите каждое хранилище репозитория в виде файла дампа:
svnrdump on repo_A
svnrdump on repo_B
svnrdump on repo_X ## X is the subsequent number of repository
После завершения процесса загрузки содержимое будет заархивировано:
bzip2 --compress repo_A_yyyymmdd.dump
bzip2 --compress repo_B_yyyymmdd.dump
bzip2 --compress repo_X_yyyymmdd.dump ## X is the subsequent number of backup copy
Затем я проведу уборку резервных копий, удалив те копии, которым больше 5 дней с сегодняшнего дня (мне нужно сохранить только последние 5 последних резервных копий):
rm `ls -t repo_A_????????.dump.bz2 | tail -n +6`
rm `ls -t repo_B_????????.dump.bz2 | tail -n +6`
rm `ls -t repo_X_????????.dump.bz2 | tail -n +6` ## X is the subsequent number of backup copy
Мой вопрос
Есть ли способ оптимизировать этот код, поместив эти repo name
в массив, а затем выполнить каждую команду для каждого репо в цикле?
Попробуйте что-то вроде этого:
Первая форма, массив суффиксов:
#!/bin/bash
array=(A B C D E F)
for i in "${array[@]}"
do
echo svnrdump on repo_$i
echo bzip2 --compress "repo_$i.dump"
done
Вторая форма, если названия репо более разнообразны:
#!/bin/bash
while read REPO; do
echo svnrdump on "${REPO}"
echo bzip2 --compress "${REPO}".dump
done << REPOLIST
repo0
repo1
repo2
repo3
REPOLIST
Вам нужно будет добавить все репо в РЕПОЛИСТ.
Или альтернативно:
repodir=/some/path
backupdir=/some/otherpath
maxagedays=6
for repo in repo_A repo_B repo_X; do
svnadmin dump $repodir/$repo | bzip2 -9 > $backupdir/$repo-`date +%F`.dump.bz2
done
find /$backupdir -type f -iname *dump.bz2 -mtime +$maxagedays -exec rm -f {} \;