如何编写 Subversion 验证脚本?

如何编写 Subversion 验证脚本?

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

任何发现的 Subversion 存储库都应将其名称打印到输出文件中,然后是输出svnadmin verify

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

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

所以我丢弃了svnlook输出,返回代码 0 表示它确实是一个 SVN 存储库。我可以使用这个代码片段,在语句中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命令中,这是不必要的,但无论如何我都做错了。构建这项任务的最佳方法是什么?

答案1

您不需要在;之后。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从 0 开始,bash -c command开始考虑之后的任何进一步参数。由于是第零个参数,我们可以将其用作第一个参数。查看以了解更多想法。command_{}man bash

相关内容