2010-01-25 74 views
3

如何使用find unix實用程序查找機器上的所有工作副本?例如,我可以使用find/-name .svn -type d命令,但它會輸出所有冗餘結果(很多子文件夾),而我只需要顯示工作副本的父目錄。查找機器上的所有subversion工作副本

有相關的問題,但它並沒有真正在我的情況有所幫助:How can I find the root folder of a given subversion working copy

+0

屬於上http://superuser.com – bzlm 2010-01-25 17:12:42

+5

我要說的是,這__IS__編程有關,至少在一定程度上也@bzlm,我懇請閱讀:HTTP://meta.stackexchange .com/questions/4128/change-the-belong-on-serverfault-tag-when-a-question-is-moving-to-serverfault/4211#4211 iee請不要使用belongs-on-xxx標籤來代替 – Kimvais 2010-01-25 17:20:04

+1

@bzim評論對錶達意見是可以的 - 標籤不是。請不要使用「belongs-on-superuser」之類的標籤,特別是不要使用這種標籤替換所有原始標籤 - 請參閱http://meta.stackexchange.com/questions/36819/too-many-questions-are-被關閉作爲不編程相關/ 36821#36821 – 2010-01-25 17:42:36

回答

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(可能需要一些調整,以標準化的目錄名(S),帶斜線..但以這種形式對我的作品,當在沒有斜線的情況下調用某個dir時)。

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 
+0

nope。它沒有按預期工作。子目錄仍然顯示 – altern 2010-01-26 10:33:38

+0

你能否給我一些無法正常工作的示例輸入? – 2010-01-26 11:42:13

+0

@Alex布朗:我的文件夾列表作爲結果 ./REL_1.0/archive/pubupdate ./REL_1.0/archive ./REL_1.0/meta ./REL_1。0 /後端 ./REL_1.0/doc ./REL_1.0/src ./REL_1.0 而只有REL_1.0文件夾是父svn庫 – altern 2010-01-26 13:12:52

1

如果你已經找到GNU /排序

find /path -type f -name ".svn*" -printf "%h\n" | sort -u 
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 
相關問題