테스트한 OS: Ubuntu 12.04
쉘(shell): bash
* grep만 이용하는 방법
리눅스에서 파일 내에 있는 특정 문자열을 검색할 때 쓰는 grep에 옵션을 더하면 현재 위치에서 하위 디렉토리에 있는 파일들까지 검색을 수행할 수 있다. Ubuntu에서는 grep가 하위 폴더 검색까지 지원하기 때문에 아래와 같이 간단하게 해결할 수 있다.
$ grep -rn "찾고자 하는 문자열" *
-r 옵션은 하위 디렉토리에 있는 파일까지 검색하겠다는 것이고,
-n 옵션은 라인 번호를 보여주는 것이다.
그냥 저렇게 실행하면 검색결과보다 "No such file or directory"와 같은 오류 메세지가 더 많이 뜨는 경우도 있다. 이 때는 명령에 "2> /dev/null"을 붙여서 검색 결과만 남겨 두고 에러 메세지는 보이지 않도록 처리할 수 있다. 아래 그림은 openwrt의 build_root 디렉토리 하위의 모든 파일들에 대해서 "setup_fname_info(struct"라는 문자열을 검색한 결과이다.
* find와 grep를 같이 이용하는 방법
그런데 리눅스 배포판에 따라서 grep의 하위 디렉토리 검색이 안되는 경우도 있다고 한다. 어디서 안되는지는 사실 모르겠다. 라우터에 들어가는 매우 가벼운 OpenWRT에서조차 -rn 옵션이 작동하는데 어디서 안되는 것일지?
어쨌든 조금 길고 복잡하지만 같은 목적을 갖는 다른 방법으로 find를 같이 이용하는 방법이 있다.
$ find . -name "*" | xargs grep -n "찾고자 하는 문자열"
참고로 grep와는 달리 find를 쓸 때의 좋은 점은 정규식을 통해서 검색할 파일의 범위를 지정할 수 있는 것이다. 예를 들면, 하위 디렉토리의 모든 .c 또는 .h 파일에 대해서만 검색을 수행하고자 할 때 아래와 같이 할 수 있다.
$ find . -name "*.[ch]" | xargs grep -n "찾고자 하는 문자열"
앞선 예제와 같은 조건에 대해서 find를 이용한 검색 화면은 아래와 같다. 참고로 맨 끝에 붙인 "--color=auto" 옵션은 텍스트와 라인 번호, 키워드 강조 색상을 주기 위해서 필요하다. "--color=auto" 옵션이 없으면 그냥 단색의 결과만 나타난다.
참고로 위의 grep -rn과 달리 검색결과가 3개만 나오는 이유 2가지는 다음과 같다.
- 확인 결과 grep에서 나온 첫번째와 두번째 검색 결과는 같은 파일이다. 경로상에서 보면 build_dir/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/linux-3.10.32는 실제로 존재하는 경로이고, build_dir/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/linux는 같은 위치에 대한 바로가기 링크이다. 즉, grep는 링크도 무시하지 않고 똑같이 하위 디렉토리로 간주하고 검색한다는 얘기.
- "xmit.c~" 파일은 xmit.c의 백업 파일인데 확장자가 "c~"기 때문에 c와 h 파일만 찾는 정규식에 의해 검색에서 제외되었다.
'IT > Linux' 카테고리의 다른 글
리눅스가 32-bit 시스템인지 64-bit 시스템인지 확인하기 (0) | 2014.04.29 |
---|---|
Ubuntu 12.04에서 grub 부팅 순서 변경 (기본 선택 변경) (9) | 2014.04.27 |
리눅스에서 와이파이(wi-fi) 애드혹(ad-hoc) 네트워크 통신이 안될 때 (2) | 2014.02.28 |
Ubuntu 12.04 / 창 크기 조절을 단축키로 쉽게 하기 (0) | 2014.02.28 |
Ubuntu 12.04 Unity 테마에서 오버레이 스크롤바(overlay scrollbar) 기능 끄기 (0) | 2014.02.28 |