1

我有这个问题:给定一个 Subversion 存储库http://svn/trunk/,我想搜索整个存储库以查找/列出所有命名的文件exp.xml(它们的整个 URL)。一旦找到第一次出现,我希望它停止进一步向下搜索 URL。为了清楚起见,这里有一些虚构的 URL:

http://svn/trunk/pro1/sub-pro-x/exp.xml/sub-pro-x1/exp.xml
http://svn/trunk/pro2/sub-pro-y/pro-y1/exp.xml/sub-pro-y1/exp.xml
http://svn/trunk/pro3/sub-pro-z/exp.xml/sub-pro-z1/exp.xml/sub-proj/exp.xml

结果应该是

http://svn/trunk/pro1/sub-pro-x/exp.xml
http://svn/trunk/pro2/sub-pro-y/pro-y1/exp.xml
http://svn/trunk/pro3/sub-pro-z/exp.xml

现在我已经有了一个解决方案,但它并不是很有效,因为我grep exp.xmlsvn -R list ---搜索了整个存储库(30-40 分钟)之后使用。如果你想知道,这里是命令:

svn list -R http://svn/trunk | grep /exp.xml

所以我的问题是是否有可能对这个查询进行任何显着的加速?我正在考虑的一件事是可能使用某种语言,最好是 Perl,直接遍历http:/svn/trunk/并处理所有链接,并在找到第一个时停止进一步向下遍历exp.xml

谢谢你的时间。

4

2 回答 2

1

如果您希望它更快,我会尝试检查 SVN 项目,然后搜索磁盘上的文件。您可以在签出的沙箱中使用“查找”执行搜索(其中“。”假设您位于项目的顶级目录中):

find . -name 'exp.xml'

但是,与您的“grep”解决方案类似,我认为它没有达到您的“停止进一步搜索”标准。如果您希望 Perl 脚本搜索“exp.xml”但在找到匹配项时停止递归,请尝试以下操作(将顶级目录作为参数):

#!/usr/bin/env perl
use warnings;
use strict;

my @dirs = $ARGV[0];

my @files;
DIR:
while (my $dir = shift @dirs) {
    opendir(my $dh, $dir) or die "Couldn't open dir $dir: $!";

    my @new_dirs;
    while (my $file = readdir($dh)) {
        # skip special directories (".", "..", and ".svn")
        next if $file =~ /^\./;

        # turn file into correct relative path
        $file = "$dir/$file";

        if (-d $file) {
            push @new_dirs, $file;
        }
        if ($file eq "$dir/exp.xml") {
            # if we matched, next outer loop so we don't recurse further
            push @files, $file;
            next DIR;
        }
    }
    # if we didn't match any files, we need to check sub-dirs
    push @dirs, @new_dirs;
}

print "$_\n" for @files;
于 2012-04-29T00:23:54.580 回答
0

使用svn ls [URL]svn ls -R [URL]与您的脚本一起列出从 [URL] 开始的 SVN 存储库。有关svn ls --help更多信息,请参阅。

于 2012-04-29T07:44:27.220 回答