find를 사용하여 파일 내 검색을 강하게 시도했습니다.

여러분은 복수의 파일로부터 있는 워드를 검색하고 싶을 때, 어떠한 기법을 이용하고 있습니까?find 명령을 사용하고 있습니다.
find 는 파일 "이름"의 검색에 자주 사용됩니다만, find 의 실행 결과를 파이프로 xargs grep 에 건네주는 것으로 파일의 내용을 검색할 수도 있습니다.
다음의 명령을 치면(자), 커런트 디렉토리 이하에 존재하는 .cc 파일중에서, hoge 라는 워드가 포함되는 행이 출력됩니다.
find . -name "*.cc" | xargs grep "hoge" -n

이 명령을 응용하여 다음과 같은 alias를 만들어 보았습니다.

.bash_aliases
function ff_orig(){
    # 正規表現による条件指定で、拡張子が.ccまたは.hであるファイルについて検索
    find . -type f -regextype posix-egrep -regex ".*\.(cc|h)" | xargs grep "$1" -n | nl | grep $1
}

function ff(){
    # 第一引数:検索ワード
    # 第二引数:エディタ(=vim)で開きたいファイルのindex
    if [ $# -eq 1 ]; then
        ff_orig $1
    elif [ $# -eq 2 ]; then
        vim `ff_orig $1 | sed -n $2p | cut -f 2 | cut -d: -f 1`
    else
        echo "error"
    fi
}

예를 들어, ownerName 라는 변수가 어디에서 사용되고 있는지 찾고 싶었을 때,
위의 alias를 사용하면 현재 디렉토리 아래에서 ownerName가 사용되는 .cc, .h 파일 및 해당 행이 출력됩니다.
$ ff ownerName
     1  ./qtenv/inspectorutil.cc:218:                const char *ownerName = owner->getFullName();
     2  ./qtenv/inspectorutil.cc:222:                label = ownerName + QString(".") + name + " --> " + nextGateOwnerName + "." + nextGateName;
     3  ./envir/sectionbasedconfig.cc:889:        std::string ownerName;
     4  ./envir/sectionbasedconfig.cc:891:        splitKey(key.c_str(), ownerName, suffix);
     5  ./envir/sectionbasedconfig.cc:895:        if (!ownerName.empty())
     6  ./envir/sectionbasedconfig.cc:896:            entry2.ownerPattern = new PatternMatcher(ownerName.c_str(), true, true, true);
     7  ./envir/sectionbasedconfig.cc:1176:                std::string ownerName;
     8  ./envir/sectionbasedconfig.cc:1178:                splitKey(key, ownerName, suffix);

실제로 아래 이미지와 같이 검색 단어에 색상이 표시됩니다.


또한,
$ ff ownerName 3

그리고 치면 sectionbasedconfig.cc를 vim에서 열 수 있습니다.

필자는 하루 100회는 사용하고 있습니다.

좋은 웹페이지 즐겨찾기