以前書いたやつだとうまくファイル名がわからないのでbashスクリプトを書いた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/bin/sh # if [ "$#" -ne 2 ]; then # echo "$0" SVNSERVER GREPARGS # exit 1 # fi SVNROOT=$1 shift GREPARGS=$@ # echo $GREPARGS if [ -z "$SVNROOT" ]; then echo "svn server is empty" exit 1; fi if [ -z "$GREPARGS" ]; then echo "grep args is empty" exit 1; fi # remove tailing slash SVNROOT=$(echo $SVNROOT | sed 's;/*$;;') # get all files in svn repository ALL=$(svn list -R $SVNROOT | awk '!/\/$/{print}' | sed "s;^;${SVNROOT}/;" | grep -i -e '\.cpp$' -e '\.c&' -e '\.h$') # echo $ALL # for each file in ALL for svnfile in $ALL; do # # echo $svnfile CONTENT="$(svn cat $svnfile | grep ${GREPARGS})" # grep succeed ? if [ $? -eq 0 ]; then # yes output result echo $svnfile echo $CONTENT fi done |
使い方
1 |
> ./svnsearchall svn://SERVER/PATH -i searchstring |
このスクリプトは*.cpp,*.c,*.hを固定でフィルタしている。
以下過去の記事:
svnレポジトリの中から全部を検索する。サーバーはserver、検索語句はaaa
1 |
$ svn list -R svn://server | awk '!/\/$/{print}' | sed 's;^;svn://server/;' | xargs -d \\n -n 1 --verbose svn cat |grep aaa |
以下、落書き
一つのコマンドにするのは大変だったので少しずつやる。
まずレポジトリの中のファイル一覧を取り出す。
1 |
$ svn list -R svn://svnserver.example.com > all |
ファイル名を検索したい場合はここからgrepすればいいが、ここでは内容から検索することを考える。
ここでallファイルにはディレクトリが含まれているのでこれを削除する。ディレクトリは最後が/で終わっているのでこれを削除する。
1 |
$ awk '!/\/$/{print}' all > all2 |
all2の各行にsvn://svnserver.example.comを加える。
1 |
$ sed 's;^;svn://svnserver.example.com/;' all2 > all3 |
これでall3はsvnのフルパスになった。つぎにsvn catを足す。
1 |
$ sed "s:^:svn cat ':" all3 | sed "s:$:':" > all4 |
grep を足す。ここでは”abc”を検索する。
1 |
$ sed 's:$:| grep -i abc:' all4 > all5 |