소스코드 디렉토리에서 뭔가 찾을때 ctags 를 쓰는데
원하는게 나오지 않을 때가 많습니다. 그래서 결국
grep -r 을 쓰게 되는데, 이건 쉽게 쓰면 바이너리까지
다 검사해 버리죠. 그래서 머리 굴려서 간단한 스크립트를
만들었습니다. 이걸 돌리기 위해서는
grep, tee, less, wc, vim, cut, find, xargs 등이
설치되어 있어야 합니다.
사용법은 다음과 같습니다:
xgrep SetClockFrequency
현재 디렉토리와 서브 디렉토리에서 소스코드일 것 같은
파일들을 뒤져서 SetClockFrequency 라는 문자열을
찾습니다.
찾은 다음에는 이것을 less로 보여주고,
less를 빠져 나가면 다시 vim -q 명령으로
하나씩 열어서 보여 줍니다.
vim 안에서 다음에 나온 SetClockFrequency를
찾는 명령은 :cn 이라는 것은 기억 하시는지?
xgrep +*.h SetClockFrequency
현재/서브 디렉토리에서 *.h 파일들만을 골라서 이들 중
SetClockFrequency 가 들어 있는 파일을 찾습니다.
그 이후는 위와 같습니다.
xgrep +*.h +*.c SetClockFrequency
현재/서브 디렉토리에서 *.h 와 *.c 파일들만을 골라서
SetClockFrequency 들어 있는 줄을 찾습니다.
그 이후는 위와 같습니다.
만약! emacs를 쓰시는 분이라면, 아래 스크립트에서
browse=어쩌구저쩌구
라고 되어 있는 줄을 지우시면 emacs 의 grep 모드용
명령으로 사용하실 수 있습니다.
음 별거 아닌 줄은 저도 알지만, 갑자기 누군가 이런게
필요할 것 같은 예감이 갑자기 스쳐서 적어 봤습니다.
---------------- xgrep.sh ------------------
#!/bin/sh
browse="|tee xgrep.out |less -eR; (wc xgrep.out && vim -q xgrep.out)"
opts=
pats=
root=.
query=
while [ ! -z "$1" ]; do
case $1 in
+*) newpat=`echo $1 |cut -c2-`; if [ -z "$pats" ]; then pats="-iname $n
ewpat"; else pats="-o -iname $newpat"; fi; ;;
*) query=$1; shift; break; ;;
esac
shift
done
rest=$*
if [ -z "$pats" ]; then
pats="-iname *.h -o -iname *.hpp -o -iname *.inc -o -iname *.c -o -iname
*.cpp -o -iname *.s -o -iname *.asm -o -iname *.java"
fi
cmd="find ${root} ${pats} |xargs grep -n ${opts} '${query}' ${rest} ${browse}";
#echo "Running:$cmd"
eval $cmd
----------------------------------------------
The Awakening