2011-11-08 3 views

答えて

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が最後に1回呼び出され、パスとURLのためにグレープされます。 (さらに、-0を使用してファイル名のスペースを避けます)

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

URLをどのように読んでいますか?私は 'svn info | grep URL'をあなたのスクリプトに挿入しますか? – Pentium10

+0

これは、ディレクトリを印刷します。 URLが必要な場合は、それぞれに 'svn info'を呼び出します。 –

+0

私は、フォルダとURLを一緒にしたい。しかし、URLが最も重要です。 – Pentium10

0

さまざまな制限があります。最も簡単な方法は、svn ls -R | grep -v "\."を実行して、現在のリポジトリの場所からすべてのサブフォルダを取得し、それを各行の先頭にlsのルートに追加するforループに送り込むことです。ただし、 "。"が含まれていないファイルがある場合は、これは適切ではありません。フォルダとして検出されます。残念ながらsvn lsでは、ファイル/フォルダでフィルタリングすることはできません。拡張子を付けずにファイル名を処理する必要がある場合は、ソースをチェックアウトし、findを使用してフォルダ名を取得するなど、別の処理を行う必要があります。

+0

現在のフォルダはSVNリポジトリではありませんが、その子孫の1つに含まれている可能性があります – Pentium10

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を保存しないようにしてください。