Как я могу использовать FIND для рекурсивного резервного копирования нескольких хранилищ Subversion - PullRequest
1 голос
/ 23 октября 2009

В настоящий момент наш скрипт резервного копирования явно запускает горячую копию svnadmin в каждом из наших репозиториев каждую ночь. Наши репозитории хранятся в родительском каталоге (/ usr / local / svn / repos) В нашем скрипте резервного копирования есть строка для каждого репозитория в этом каталоге: Горячая копия svnadmin / usr / local / svn / repos / myrepo1 / usr / local / backup / myrepo1

Вместо того, чтобы вручную добавлять новую строку для каждого нового репо, которое мы подключаем к сети, я надеялся использовать команду find для запуска горячей копии svnadmin для каждого каталога, найденного в /usr/local/svn/repos.

Пока у меня есть:

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \;

, где я заменяю "горячую копию svnadmin" на "эхо" для простоты. Выход которого:

/usr/local/backup/usr/local/svn/repos/ure
/usr/local/backup/usr/local/svn/repos/cheetah
/usr/local/backup/usr/local/svn/repos/casemgt
/usr/local/backup/usr/local/svn/repos/royalliver
/usr/local/backup/usr/local/svn/repos/ure_andras
/usr/local/backup/usr/local/svn/repos/profserv
/usr/local/backup/usr/local/svn/repos/frontoffice
/usr/local/backup/usr/local/svn/repos/ure.orig
/usr/local/backup/usr/local/svn/repos/projectcommon
/usr/local/backup/usr/local/svn/repos/playground
/usr/local/backup/usr/local/svn/repos/casegen

Проблема в том, что полный путь включен в {}. Мне нужен только последний элемент имени каталога, переданный в -exec

Вывод, который я хочу получить:

/usr/local/backup/ure
/usr/local/backup/cheetah
/usr/local/backup/casemgt
/usr/local/backup/royalliver
/usr/local/backup/ure_andras
/usr/local/backup/profserv
/usr/local/backup/frontoffice
/usr/local/backup/ure.orig
/usr/local/backup/projectcommon
/usr/local/backup/playground
/usr/local/backup/casegen

Я довольно сильно застрял на этом этапе. Может кто-нибудь помочь мне здесь? Заранее спасибо, Dave

Ответы [ 4 ]

1 голос
/ 23 октября 2009

Вы были на правильном пути. Попробуйте это:

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -printf "%f\0" | xargs -0 -I{} echo svnadmin hotcopy /usr/local/svn/repos/\{\} /usr/local/backup/\{\}

%f похоже на basename, а нулевой плюс -0 на xargs гарантирует, что имена с пробелами и т. Д. Успешно пройдут.

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

0 голосов
/ 23 октября 2009

Как насчет добавления фильтра sed, вырезавшего среднюю часть?

sed 's/usr.local.svn.repos.//g'

добавлено вот так

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} ";" | sed 's/usr.local.svn.repos.//g'
0 голосов
/ 23 октября 2009
ls -al /usr/local/svn/repos/ |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo /usr/local/svn/repos/zzyggy

Это немного длинно, но делает свое дело. Вам не нужно делать все с find, когда есть много других команд оболочки, хотя, если бы мне пришлось писать этот вид сценария, я бы сделал это на Python и оставил бы оболочку для интерактивной работы.

ls -al перечисляет все файлы в названном каталоге с атрибутами

grep '^d' выбирает строки, начинающиеся с d, которые являются каталогами

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

xargs берет список имен каталогов и выдает его по одному. Я указал zzyggy в качестве имени для замены в выполненной команде, но вы можете выбрать то, что вам нравится. Конечно, вы должны заменить echo командой svnadmin.

Если это было в сценарии оболочки, вы действительно должны сделать это

SVNDIRNAME="/usr/local/svn/repos"
ls -al $SVNDIRNAME |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo $SVNDIRNAME/zzyggy

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

0 голосов
/ 23 октября 2009

поставить команду обрезки в конце

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...