리눅스 폴더 찾기 grep - linugseu poldeo chajgi grep

OVERCODE

리눅스 파일 찾기, 파일속 문자열 찾기 본문

리눅스

리눅스 파일 찾기, 파일속 문자열 찾기

오버코드 2016. 1. 15. 00:56

1. 리눅스 파일명으로 검색하는법.

사용법

find [찾을위치] -name [파일명]

예) 최상위 폴더부터 하위로 'apache'로 시작하는 파일 찾기.

find / -name 'apache*'

예) usr 폴더부터 하위로 'apa'로 시작하는 파일 찾기.

find /usr/ -name 'apa*'

2. 리눅스 파일 내부 문자열 검색하는법.

grep 을 이럴때 유용하게 쓸 수 있습니다.

사용법

grep -r [찾을 문자열] [대상파일들]

예) 현재 폴더에 있는 test.log 파일내부에 'apache' 라는 문자열 찾기.

grep -r 'apache' ./test.log

예) 'var' 폴더부터 하위 모든 파일내부에서 'apache' 라는 문자열 찾기.

grep -r 'apache' /var/* [--include '*.conf'] (include 옵션으로 특정 확장자에서만 검색도 가능하다)

3. 파일 내부 문자열 검색 다른 방법 (Feat. 강조색)

find . -type f -print | xargs grep -i "phpMyAdmin" /dev/null

현재위치부터 하위폴더의 모든 파일중에서 'phpMyAdmin' 이라는 문자열을 검색한다.

find . -name '*.conf' | xargs grep -r --color=auto -n 2>dev/null 'phpMyAdmin'

현재 부터 하위 모두를 검색하되,

conf 라는 확장자를 가진 파일중에서 'phpMyAdmin' 이라는 문자열을 검색한다.

그리고 일치 문자열은 강조색으로 표시!

이상으로 리눅스 파일명으로 찾기, 파일속 문자열 검색까지 알아보았습니다.

리눅스(Linux)

[리눅스] 파일 찾기(ls), 파일 내부 문자열 찾기(grep)

[리눅스] 파일 찾기(ls), 파일 내부 문자열 찾기(grep)

자꾸 까먹어서 정리해봅니다.

1. 파일 찾기(ls)

개인적으로 파일 찾기는 find보다 ls가 편하다고 봅니다. 확장자가 xml인 파일을 모두 찾겠습니다. 아래와 같이 씁니다.

ls -al | grep '.*[.]xml'

또는

ls -al | grep '.*\.xml'

만약 하위 모든 폴더를 대상으로 찾고 싶다면 옵션에 대문자 R를 추가합니다. Recursive의 약자입니다.

ls -alR | grep '.*[.]xml'

또는

ls -alR | grep '.*\.xml'

만약 하위 폴더 중에 'log'폴더를 찾고 싶다면, 문자열 log로 끝나는(정규식의 $) 파일 리스트를 출력해보면 되겠습니다.

ls -alR | grep 'log$'

2. 파일 내부 문자열 찾기(grep)

파일 내부의 문자열을 검색합니다. 내부에 encoding이라는 문자열이 포함된 xml 파일을 모두 찾겠습니다. 아래와 같이 씁니다. (grep 찾는내용 찾을위치)

grep 'encoding' ./*.xml 

만약 하위 모든 폴더를 대상으로 찾고 싶다면 옵션에 소문자 r을 부여합니다.

grep -r 'encoding' ./*.xml

아래와 같이 쓰면 하위 모든 디렉토리의 모든 파일들 대상으로 특정 문자열을 찾습니다.

grep -r '찾는문자열' ./*

테스트한 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 파일만 찾는 정규식에 의해 검색에서 제외되었다.