繁体   English   中英

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

[英]How can I use FIND to recursively backup multiple subversion repositories

目前,我们的备份脚本每天晚上在每个存储库上明确运行svnadmin hotcopy。 我们的存储库都存储在父目录(/ usr / local / svn / repos)下。备份脚本在该目录下的每个存储库都有一行,分别是:svnadmin hotcopy / usr / local / svn / repos / myrepo1 / usr /本地/备份/ myrepo1

我希望不必为每个联机的新仓库手动添加新行,而是希望使用find命令对在/ usr / local / svn / repos下找到的每个目录运行svnadmin hotcopy。

到目前为止,我已经:

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

在这一点上,我几乎陷入了困境。 有人可以帮我从这里出去吗? 预先感谢,戴夫

您在正确的轨道上。 尝试这个:

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并且xargs上的null加上-0可确保成功传递带有空格等的名称。

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

在最后放置剪切命令

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

如何添加一个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'
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世纪这种问题的一种更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM