리눅스 find grep 명령어 사용법 (파일 찾기와 내용 검색)
지난 시간까지 기본 명령어로 디렉터리도 만들어 보고 vi 편집기를 통해 새로운 파일도 만들어 보았다. 그러면 이제 다음 과정으로 리눅스 find grep 명령어로 파일을 찾고, 파일 안의 내용을 검색하는 방법에 대해 알아보고자 한다. 파일이 어디에 어떤 것이 있는지 모두 기억하고 있으면 좋겠지만 사람의 기억력이라는 것이 사실 그렇게 좋지 않다. 리눅스는 이런 사용자들을 위해 다양한 찾기 기능을 제공하는데, 그 가운데 가장 많이 쓰는 것이 find와 grep이다.
둘 다 무언가를 찾는다는 공통점이 있지만 탐색 대상이 다르다. find는 이름, 크기, 수정 시간 같은 조건으로 파일 자체를 찾고, grep은 파일 안의 문자열을 찾는다. 이번 글에서는 두 명령어의 기본 문법과 자주 쓰는 옵션, 바로 따라 해 볼 수 있는 예제, 그리고 둘을 조합해서 쓰는 방법까지 정리해 보겠다.

리눅스 find grep 명령어 차이 한눈에 보기
| 구분 | find | grep |
|---|---|---|
| 찾는 대상 | 파일, 디렉터리 자체 | 파일 안의 문자열 |
| 검색 기준 | 이름, 종류, 크기, 수정 시간, 소유자 | 문자열, 정규식 패턴 |
| 대표 예시 | find /var/log -name "*.log" | grep -n "error" app.log |
| 이럴 때 쓴다 | 파일이 어디 있는지 모를 때 | 어떤 내용이 어느 파일, 몇 번째 줄에 있는지 찾을 때 |
find 명령어 사용법
find는 계층적인 디렉터리 구조에서 특정 파일이나 디렉터리를 검색하는 명령어이며, 다음과 같이 구성된다.
find [경로] [조건] [동작]
경로 → 조건 → 동작 순서로 입력하는데, 경로는 여러분이 익히 알고 있는 디렉터리 경로를 의미한다. 경로를 생략하면 현재 디렉터리부터 하위 디렉터리까지 모두 검색한다. 조건과 동작에는 아래와 같은 옵션들이 있다. 많이 써 보면서 손에 익히도록 하자.
자주 쓰는 조건
| 조건 | 설명 | 예시 |
|---|---|---|
-name | 이름으로 검색 (대소문자 구분) | -name "*.log" |
-iname | 이름으로 검색 (대소문자 무시) | -iname "readme*" |
-type | 종류 지정, f(파일), d(디렉터리) | -type f |
-size | 크기로 검색 (+이상, -이하 / c 바이트, k 킬로, M 메가, G 기가) | -size +100M |
-mtime | 수정한 지 며칠 지났는지로 검색 (-7은 7일 이내, +30은 30일 이전) | -mtime -7 |
-user | 특정 사용자가 소유한 파일 검색 | -user www-data |
자주 쓰는 동작
| 동작 | 설명 |
|---|---|
-print | 기본값, 터미널에 파일의 경로와 이름을 출력 |
-ls | 권한, 크기, 날짜 등 자세한 정보 표시 |
-exec 명령어 {} \; | 검색한 파일마다 지정한 명령어 실행 |
-ok 명령어 {} \; | -exec와 같지만 실행할 때마다 확인을 묻는 대화식 |
-delete | 검색한 파일 삭제 (주의해서 사용) |
이름으로 파일 찾기
시스템 전체에서 이름이 test인 파일을 찾으려면 다음과 같이 입력한다. 옵션과 값 사이는 반드시 띄어 써야 한다. -typef처럼 붙여 쓰면 오류가 난다.
find / -name test -type f
그런데 실제로 실행해 보면 권한이 없는 디렉터리에서 Permission denied 메시지가 잔뜩 출력된다. 오류 메시지는 숨기고 결과만 보고 싶다면 뒤에 2>/dev/null을 붙이자.
sudo find / -name "nginx.conf" 2>/dev/null*.log처럼 와일드카드를 쓸 때는 반드시 따옴표로 감싸야 한다. 따옴표가 없으면 셸이 현재 디렉터리의 파일 이름으로 먼저 바꿔 버려서 엉뚱한 결과가 나오거나 오류가 난다.
find /var/log -name "*.log"숨김 파일 찾기
리눅스에서 이름이 점(.)으로 시작하는 파일은 숨김 파일이다. 사용자 홈 디렉터리(~)에서 숨김 파일을 찾고 자세한 정보까지 출력하려면 다음과 같이 입력한다.
find ~ -name ".*" -ls크기와 수정 시간으로 찾기
디스크 용량이 갑자기 부족해졌다면 큰 파일부터 찾아보는 것이 순서다. 아래는 /var/log 아래에서 100MB가 넘는 파일을 찾는 명령어다. 디스크 사용량 자체를 확인하는 방법은 리눅스 디스크 확인 방법(df/du) 글을 참고하자.
find /var/log -type f -size +100M
최근 7일 안에 수정된 파일만 보고 싶다면 -mtime -7을 쓴다. 반대로 30일보다 오래된 파일은 -mtime +30이다. 설정 파일을 누가 언제 건드렸는지 추적할 때 유용하다.
find /etc -type f -mtime -7찾은 파일에 명령어 실행하기 (-exec)
find의 진짜 힘은 찾은 파일에 바로 명령어를 실행할 수 있다는 데 있다. {} 자리에 찾은 파일 이름이 들어가고, 명령어 끝은 \;로 닫는다. 예를 들어 /tmp에서 7일이 지난 .tmp 파일을 지우려면 다음과 같다.
find /tmp -name "*.tmp" -mtime +7 -exec rm {} \;
다만 삭제처럼 되돌릴 수 없는 작업은 먼저 -print로 대상을 확인한 다음 실행하는 습관을 들이자. 실행할 때마다 하나씩 확인받고 싶다면 -exec 대신 -ok를 쓰면 된다.
find /tmp -name "*.tmp" -mtime +7 -printgrep 명령어 사용법
grep은 파일 내용에서 특정 문자나 패턴을 검색하는 명령어다. 파일 이름으로 검색하던 find와 달리 파일 안을 들여다볼 수 있어서, 로그 분석이나 설정 파일 확인에 정말 많이 쓴다. 기본 형식은 다음과 같다.
grep [옵션] [패턴] [파일 이름]
옵션을 선택하고 패턴을 지정한 다음 어떤 파일에서 찾을지를 지정하면 된다. 글로만 보면 어렵게 느껴질 수 있지만 실제로 몇 번 조회해 보면 금방 익숙해진다.
자주 쓰는 옵션
| 옵션 | 설명 |
|---|---|
-i | 대소문자 무시 |
-n | 매칭되는 줄 번호 표시 |
-v | 패턴이 없는 줄만 출력 |
-c | 매칭되는 줄 개수 출력 |
-w | 단어 단위로 검색 |
-l | 패턴이 있는 파일 이름만 출력 |
-r | 하위 디렉터리까지 재귀 검색 |
-E | 확장 정규식 사용 (여러 패턴을 | 로 연결) |
-A / -B / -C | 매칭된 줄의 뒤(After) / 앞(Before) / 앞뒤(Context) 줄 함께 출력 |
파일에서 문자열 찾기
가장 기본적인 사용법이다. 시스템 로그에서 error가 들어간 줄을 줄 번호와 함께 찾는다. 대소문자를 가리지 않으려면 -i를 더하면 된다. 로그 파일이 어디에 있는지 헷갈린다면 리눅스 로그 파일 위치 정리 글을 먼저 보고 오자.
grep -n "error" /var/log/sysloggrep -in "error" /var/log/syslog디렉터리 전체에서 찾기 (-r, -l)
어떤 설정값이 어느 파일에 들어 있는지 모를 때는 -r로 디렉터리 전체를 뒤지면 된다. 파일 이름만 필요하다면 -l을 쓴다. 아래 마지막 예제는 /etc 아래에서 bash라는 문자열이 들어 있는 파일 이름만 출력한다.
grep -rn "DB_HOST" /var/wwwgrep -rl "DB_HOST" /var/wwwgrep -l bash /etc/*앞뒤 줄 함께 보기와 여러 패턴 찾기
에러 로그는 에러가 난 줄 하나만 봐서는 원인을 알기 어렵다. -A, -B로 앞뒤 줄을 같이 보면 훨씬 수월하다. 여러 단어를 한 번에 찾고 싶을 때는 -E와 | 를 쓴다.
grep -n -B 2 -A 3 "Exception" app.loggrep -E "error|warn" app.log파이프로 다른 명령어 결과 거르기
grep은 파일뿐 아니라 다른 명령어의 출력도 걸러 준다. 실행 중인 프로세스 중에서 nginx만 보거나, tail -f로 실시간 로그를 보면서 500 에러만 걸러 낼 수 있다. 프로세스 확인은 리눅스 프로세스 명령어 글에 자세히 정리해 두었다.
ps aux | grep nginxtail -f /var/log/nginx/access.log | grep " 500 "find와 grep 함께 쓰기
리눅스 find grep 조합은 실무에서 특히 자주 쓴다. find로 대상 파일을 좁히고 grep으로 내용을 검색하는 방식이다. 예를 들어 /var/www 아래 PHP 파일 중에서 mysqli_connect를 쓰는 파일만 찾으려면 다음과 같다. 끝을 \; 대신 +로 닫으면 파일을 묶어서 한 번에 넘기기 때문에 훨씬 빠르다.
find /var/www -name "*.php" -exec grep -l "mysqli_connect" {} +
xargs를 써도 같은 결과를 얻을 수 있다. 다만 파일 이름에 공백이 있으면 깨지기 때문에 -print0과 xargs -0을 짝으로 쓰는 것이 안전하다. 아래는 최근 하루 사이에 수정된 로그 파일에서 ERROR를 찾는 예제다.
find . -name "*.log" -mtime -1 -print0 | xargs -0 grep -n "ERROR"
확장자로만 거르는 간단한 경우라면 grep 하나로도 충분하다. --include 옵션으로 검색할 파일 패턴을 지정하면 된다.
grep -rn --include="*.php" "mysqli_connect" /var/www리눅스 find grep 사용 시 자주 하는 실수
- 와일드카드에 따옴표를 빼먹는 경우:
find . -name *.log는 셸이 먼저 확장해 버린다."*.log"처럼 감싸자. - -exec 끝을 닫지 않는 경우:
\;나+가 없으면missing argument to `-exec'오류가 난다. - 옵션과 값을 붙여 쓰는 경우:
-typef가 아니라-type f다. - -delete 위치를 잘못 두는 경우: find는 왼쪽부터 순서대로 평가하기 때문에
-delete를 조건보다 앞에 두면 경로 아래 파일이 전부 지워진다. 항상 조건 뒤에 두고, 먼저 -print로 확인하자. - 권한 때문에 결과가 비는 경우: 읽기 권한이 없는 파일은 grep이 내용을 볼 수 없다. 필요하면 sudo를 붙이고, 권한 개념은 리눅스 파일 권한(chmod/chown) 글을 참고하자.
리눅스 find grep 자주 묻는 질문
find와 locate는 무엇이 다를까?
locate는 미리 만들어 둔 파일 목록 데이터베이스에서 찾기 때문에 매우 빠르다. 대신 데이터베이스를 갱신(updatedb)하기 전에 새로 만든 파일은 나오지 않는다. find는 매번 실제 디렉터리를 뒤지기 때문에 느리지만 항상 현재 상태를 보여 준다.
grep 결과에서 찾은 단어에 색을 칠할 수 있을까?
--color=auto 옵션을 붙이면 매칭된 부분이 강조된다. Ubuntu 등 대부분의 배포판은 이미 grep에 이 옵션이 alias로 걸려 있어서 따로 붙이지 않아도 색이 보인다.
대용량 로그에서 grep이 너무 느리다면?
먼저 find의 -mtime으로 최근 파일만 골라 검색 범위를 줄이자. 그래도 느리다면 grep보다 훨씬 빠른 ripgrep(rg)을 설치해서 쓰는 것도 방법이다.
grep으로 찾은 줄을 바꾸거나 원하는 칸만 뽑아 집계하고 싶다면 sed와 awk 사용법으로 이어서 보면 된다.
마무리
여기까지 리눅스 find grep 명령어의 기본 사용법과 자주 쓰는 옵션을 알아보았다. 정리하면 파일을 찾을 때는 find, 파일 안의 내용을 찾을 때는 grep, 특정 파일들 안에서 내용을 찾을 때는 둘을 조합해서 쓰면 된다. 더 많은 옵션이 궁금하다면 GNU find 공식 매뉴얼과 GNU grep 공식 매뉴얼을 참고하자.
앞선 시간에 공부했던 기본 명령어와 vi 편집기에 이번 find/grep까지 자연스럽게 다룰 줄 안다면 이제 리눅스를 어느 정도 다룰 수 있다고 말할 수 있겠다. 이 글의 예제를 보면서 따라 하더라도 쓸 줄만 안다면 충분하다. 뭔가를 보고 하더라도 기본 바탕이 없으면 그것조차 할 수 없으니 말이다. 여기까지 왔다면 처음에 비해 많은 걸음을 내디뎠다. 조금만 더 힘내자.
첫 댓글을 남겨보세요