如何编写Subversionvalidation脚本?

从这个问题开始 ,我正在尝试编写一个bash脚本,它将从包含我的subversion存储库的目录中递归两个目录,检查目录是否是存储库。 将存在目录和存储库的混合,以及隐藏在这些子目录中的一些存储库。

发现的任何Subversion repos应将其名称打印到输出文件,然后输出svnadmin verify

我有以下代码片段来检查目录是否是存储库:

 svnlook info /path/to/repo >/dev/null 

所以我扔掉了svnlook输出,返回代码为0表示它确实是一个SVN repo。 我可以使用这个片段,在if语句中运行svnadmin verify是否返回0。

我试过了:

 find /dir/containing/repos -maxdepth 2 -type d -exec bash -c 'if [ "svnlook info {} >/dev/null" = 0 ] ;then ;echo "{}" >>output.txt ;svnadmin verify "{}" >>output.txt ;fi' \; 

虽然我发现每个目录都有以下警告:

 bash: -c: -line 0: syntax error near unexpected token ';' 

我想我正试图不必要地将它全部塞进一个find命令中,无论如何我都错了。 构建此任务的最佳方法是什么?

你不需要; thenthen ;echo "{}" >>output.txt

使用 :

 then echo "{}" >>output.txt 

还要注意,而不是使用{}使用shell的位置参数(我不熟悉svn所以依赖于你的命令):

 find /dir/containing/repos -maxdepth 2 -type d -exec bash -c 'if svnlook info /path/to/repo >/dev/null ;then echo "$1" >>output.txt ;svnadmin verify "$1" >>output.txt ;fi' _ {} \; 
  • if svnlook info /path/to/repo >/dev/null将运行该命令并将STDOUT重定向到/dev/null

  • 如果svnlook info /path/to/repo命令成功(退出代码0),则echo "$1" >>output.txt ;svnadmin verify "$1" >>output.txt命令将运行

  • 这里我们使用目录名{}作为由shell处理的第一个参数( $1 )。

  • _这里只是一个占位符,表示位置参数0,因为bash -c command在从0开始的command后开始考虑任何进一步的参数。由于_是第零个参数,我们可以使用{}作为第一个参数。 检查man bash以获得更多想法。