HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

Linux find exec grep

리눅스를 사용하다보면 검색할 일이 정말 많아집니다. 그중에서도 findgrep은 빠질 수가 없죠. 이번 포스팅은 이 두 명령어를 조합해서 사용할 수 있는 간단한 팁을 하나 공유하고자 합니다.

View Script

아래의 스크립트는 특정 키워드(YOUR_KEYWORD라 되어 있는 부분)가 있는 파일명과 줄번호를 보여줍니다.

find . -type f -name "*" -exec grep -Hn --color "YOUR_KEYWORD" {} \;

Analzye Script

위의 스크립트를 분석 단위로 분해를 해보면 아래처럼 됩니다.

find .                                         # (1)
-type f                                        # (2)
-name "*"                                      # (3)
-exec grep -Hn --color "YOUR_KEYWORD" {} \;    # (4)

4개로 나눠봤습니다. 그럼 하나씩 살펴 봅시다. 우선 (1)번 커맨드는 우리가 잘 알고 있는 find 커맨드와 찾고자 하는 경로입니다. 여기서는 .을 입력해서 현재 경로를 탐색하도록 되어 있습니다. 입맛대로 변경해주시면 됩니다.

(2)번 커맨드는 찾고자 하는 형식을 지정합니다. 해당 타입에 들어갈 값은 man find를 이용해서 상세한 설명을 볼 수 있습니다. 여기서는 f로 지정했고 이것이 뜻하는 바는 regular file이라는 뜻입니다. 일반적인 파일을 말합니다.

(3)번 커맨드는 찾고자 하는 파일명에 대한 정규식을 지정할 수 있습니다. 여기서는 모든 파일을 검색하도록 *을 추가했습니다.

(4)번 커맨드는 앞서 find 커맨드 실행을 통해 나온 결과 파일 목록을 grep 커맨드로 넘겨줍니다. 여기서 grep의 옵션으로 -H가 있는데 이는 해당 파일의 이름을 보여주는 것이고 -n은 키워드를 찾은 줄번호를 출력합니다. 마지막으로 --color 옵션은 출력할 내용에 예쁘게 색칠(!)을 해주는 용도입니다. 바로 옆에 "YOUR_KEYWORD" 부분은 찾고자 하는 문자열을 넣어줍니다. 그리고 마지막에는 {} \;를 넣어주도록 합니다.

TIP. Usage find -exec Option

find ... -exec Command {} \;

여기서 {}는 앞서 find로 찾아낸 파일을 뜻하고 \;-exec의 옵션의 끝을 알립니다. 따라서 Command 부분의 실행할 것에 find로 찾아낸 파일 목록을 넘겨주는 셈입니다.

TIP

위의 스크립트를 응용할 수 있는 방법을 몇가지 소개하고자 합니다.

Operators

리눅스 find 커맨드에는 오퍼레이터(operators)가 존재합니다. 오퍼레이터라는건 일종의 연속적인 표현처리(?)라고 말할 수 있겠습니다. 아래의 형식처럼 사용합니다.

# 표현식을 and 연산합니다.
# expr1 -a expr2 (= expr1 -and expr2)
find . -type f -name "*.html" -a -name "in*" # (1)

# 표현식을 or 연산합니다.
# expr1 -o expr2 (= expr1 -or expr2)
find . -type f -name "*.html" -o -name "*.js" # (2)

(1)번 커맨드는 파일명이 .html로 끝나면서 시작은 in인 파일의 목록을 출력합니다. (2)번은 파일명이 .html로 끝나거나 .js가 끝나는 파일명을 출력하는 것입니다.

위에 언급한 연산자 외에도 다른 연산자들이 많습니다. 연산자에 대한 자세한 내용은 man find에서 찾아볼 수 있습니다.

more

너무 파일이 많고 검색된 내용도 많아서 콘솔화면에 전부 표현할 수 없다면 more을 활용해 봅시다. 쪽단위로 출력할 수 있게 해줍니다.

find . -type f -name "*" | more

Closing Remarks

간단하게 find exec grep에 대해 알아봤습니다. :)