Как я могу использовать FIND для рекурсивного резервного копирования нескольких хранилищ Subversion
Вопрос
В настоящий момент наш скрипт резервного копирования явно запускает горячую копию 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
Решение
Вы были на правильном пути. Попробуйте это:
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
и внесите любые необходимые изменения, и это должно помочь.
Другие советы
поместите команду обрезки в конец
find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"
Как насчет добавления фильтра red
, обрезающего среднюю часть?
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'
ls -al /usr/local/svn/repos/ |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo /usr/local/svn/repos/zzyggy
Это немного долго, но делает свое дело. Вам не нужно делать все с поиском, когда есть много других команд оболочки, хотя, если бы мне пришлось писать такой скрипт, я бы сделал это на 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 веке.