在机器上找到所有subversion工作副本

时间:2010-01-25 17:02:37

标签: svn bash unix find

如何使用find unix实用程序查找计算机上的所有工作副本?例如,我可以使用find / -name .svn -type d命令,但它输出所有冗余结果(很多子文件夹),而我只需要显示工作副本的父目录。

有相关问题,但在我的案例中并没有真正帮助:How can I find the root folder of a given subversion working copy

4 个答案:

答案 0 :(得分:6)

更新3 - 查找的排序输出以确保.svn出现在隐藏文件之前。对于签入的隐藏目录,仍然可能会失败。


Perl可以为您删除嵌套路径:

find -s . -ipath *.svn | perl -lne's!/\.svn$!!i;$a&&/^$a/||print$a=$_'

在人类中,这表示:对于每个svn路径,忽略/.svn部分,如果当前路径是最后一条我打印的子路径,请不要打印它。

示例:对于目录结构:

$ find .
.
./1
./1/.svn
./1/1
./1/1/.svn
./2
./2/.svn
./3

这会产生

./1
./2

答案 1 :(得分:5)

也许是这样的?

#!/bin/bash
if [ -d "$1/.svn" ]; then
        echo $1
else
        for d in $1/*
        do
                if [ -d "$d" ]; then
                        ( $0 $d )
                fi;
        done
fi;

将它命名为,例如 - find_svn.sh,使其成为可执行文件,并调用./find_svn.sh /var/www(可能需要一些调整来规范化目录名称,删除尾部斜杠...但是对我来说这种形式,当在某个目录上调用而没有斜杠时。)

答案 2 :(得分:1)

如果您有GNU查找/排序

find /path -type f -name ".svn*" -printf "%h\n"  | sort -u

答案 3 :(得分:1)

以下对我来说很好。它还查找所有稀疏检出(或嵌套的工作副本)。

find $PWD -type d -wholename "*/.svn" |
while read path
do
    path=${path%%/.svn}
    wcr=$(svn info ${path} 2>/dev/null | perl -F"/:\s/" -le '{ print $F[1] if $F[0] =~ /^Working Copy Root/;  }')
    [ "$path" = "$wcr" ] && {
        echo -e "\n  WC Root $path"; svn stat -qu $path;
        }
done