如何使用find
unix实用程序查找计算机上的所有工作副本?例如,我可以使用find / -name .svn -type d
命令,但它输出所有冗余结果(很多子文件夹),而我只需要显示工作副本的父目录。
有相关问题,但在我的案例中并没有真正帮助:How can I find the root folder of a given subversion working copy
答案 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