如何使用FIND递归备份多个subversion存储库

时间:2009-10-23 11:43:43

标签: linux svn bash find

目前,我们的备份脚本每晚在每个存储库上显式运行svnadmin hotcopy。我们的存储库都存储在父目录下(/ usr / local / svn / repos) 我们的备份脚本在该目录下的每个repos都有一行代码: svnadmin hotcopy / usr / local / svn / repos / myrepo1 / usr / local / backup / myrepo1

我不希望为每个我们带来的新repo手动添加新行,而是希望使用find命令为/usr/local/svn/repos.//下找到的每个目录运行svnadmin hotcopy。 p>

到目前为止,我已经:

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

,为了简单起见,我用“echo”代替“svnadmin hotcopy”。 其输出是:

/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

我几乎陷入困境。有人可以帮我从这里出去吗? 提前致谢, 戴夫

4 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。试试这个:

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/\{\}

%fbasename类似,而xargs上的null加上-0可确保带有空格等的名称成功传递。

只需移除echo并进行您可能需要的任何调整,它应该可以解决问题。

答案 1 :(得分:0)

在最后放一个剪切命令

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"

答案 2 :(得分:0)

如何添加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'

答案 3 :(得分:-1)

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

它有点长,但它可以解决问题。当有很多其他shell命令时,你不需要使用find做任何事情,虽然如果我必须编写这种脚本,我会用Python做这个并留下shell用于交互式工作。

ls -al列出命名目录中具有属性

的所有文件

grep '^d'选择以d开头的行,即目录

sed剥离实际目录名左侧的所有字符。您可能需要添加或删除一些点

xargs获取目录名称列表并一次发出一个目录名称。我在执行的命令中指定了zzyggy作为替换名称,但是您可以选择自己喜欢的名称。当然,您可以使用svnadmin命令替换echo。

如果它是在shell脚本中你应该真的这样做

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

但我决定以错误和正确的方式来解释这一点。我打算用一些shell标签标记这个,但我仍然认为Python脚本是解决21世纪这类问题的一种优秀方法。