Как я могу использовать FIND для рекурсивного резервного копирования нескольких хранилищ Subversion

StackOverflow https://stackoverflow.com/questions/1612904

  •  06-07-2019
  •  | 
  •  

Вопрос

В настоящий момент наш скрипт резервного копирования явно запускает горячую копию 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 веке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top