以此为起点问题,我正在尝试编写一个 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
您不需要在;
之后。then
then ;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