以递归模式列出文件夹中的所有SVN存储库URL

时间:2011-11-08 13:50:19

标签: linux svn bash shell

我们正在寻找一个脚本,它将以递归模式遍历所有子文件夹,并列出所有SVN存储库URL及其找到的路径。

它将用于用户的/ home文件夹。

3 个答案:

答案 0 :(得分:4)

递归查找目录,并为每个目录尝试获取SVN信息。如果成功,则不要进入目录并打印目录名称。

find -type d -exec bash -c "svn info {} > /dev/null 2> /dev/null" \; -prune -print

这将列出目录。

如果您需要存储库信息,可以在find exec命令的中间添加它。

find -type d -exec bash -c "svn info {} 2> /dev/null | grep URL" \; -prune -print

修改

通过仅测试.svn子目录的存在,我发现了更好的结果。然后,在最后调用svn info一次,并为Path和URL进行grepped。 (另外使用-0来防止文件名中的空格。)

find -type d -exec test -d "{}/.svn" \; -prune -print0 | xargs -0 svn info | grep -e '\(Path\|URL\)'

答案 1 :(得分:0)

根据您的限制,可能会有不同的方式。最简单的方法是执行svn ls -R | grep -v "\."从您所在的存储库位置获取所有子文件夹,并将其输入到for循环中,该循环将URI添加到ls的根目录中每条线的前面。但是,如果您的文件不包含“。”,则这将是不够的。因为它们将被检测为文件夹。遗憾的是svn ls不允许您按文件/文件夹进行过滤,因此如果您需要处理没有扩展名的文件名,那么您必须执行一些不同的操作,例如签出源代码并使用find获取文件夹名。

答案 2 :(得分:0)

user_home=... # fill in the user's home dir
old_dir=/../
find $user_home -name .svn | rev | cut -f2- -d/ | rev | while read line ; do
    echo -n "$line"$'\t'
    wc -c <<<"$line"
done | sort -t$'\t' -k1,1 -k2,2n | while read dir size ; do
    if [[ $dir != $old_dir* ]] ; then
        old_dir=$dir
        svn info $dir | grep URL
        echo PATH: $dir
        echo
    fi
done

希望用户不要将SVN存储在名称中带空格的目录下。