sy/dev
Study
6 min read

파일 검색 명령어 정리 — find, grep, fd, ripgrep

터미널에서 '그 파일 어디 있더라'와 '이 단어 어느 파일에 있더라'를 빠르게 해결하는 네 가지 도구 — find, grep, fd, ripgrep을 한 번에 정리한다.

공부하게 된 계기

검색은 두 종류다.

  1. 파일을 찾는 검색 — "내가 만든 그 .env.local 어디 있더라"
  2. 파일 내용을 찾는 검색 — "이 함수 어디서 호출되더라"

매번 도구를 헷갈렸다. find로 내용 검색하려고 한참 애쓰다가, 결국 grep을 써야 한다는 걸 깨닫는다. 그러다 fdripgrep이라는 빠른 대안이 있다는 걸 알게 됐다. 한 번에 정리해두면 두고두고 쓸 수 있어서 글로 남긴다.

4개 도구 한눈에

도구무엇을 찾나속도gitignore설치
find파일 (이름·속성)보통×기본
grep내용보통×기본
fd파일 (이름)빠름별도
rg (ripgrep)내용매우 빠름별도

핵심은 gitignore 자동 적용 여부다. node_modules.next 안을 매번 뒤지지 않는다는 게 fd/rg의 가장 큰 장점이다.

1) find — 표준이지만 문법이 까다롭다

리눅스 어디든 깔려 있는 표준 도구.

# 현재 디렉토리 이하에서 .ts 파일 모두
find . -name "*.ts"
 
# 디렉토리만
find . -type d -name "components"
 
# 7일 이내 수정된 파일
find . -mtime -7
 
# 크기 100MB 이상
find . -size +100M
 
# 찾은 파일에 명령 실행
find . -name "*.log" -delete
find . -name "*.tmp" -exec rm {} \;

문법이 옵션 순서, \; 같은 escape 등 까다로운 편이다. 그래도 표준이라 어디서든 통한다.

⚠️

find . -name "*.tsx" 처럼 alternation을 쓸 때 '.*\(tsx\|ts\)' 같은 패턴은 긴 확장자를 먼저 써야 한다. 짧은 게 먼저 매칭되면 .tsx 파일이 누락될 수 있다.

2) grep — 내용 검색의 정석

# 한 파일에서 검색
grep "useState" src/components/Header.tsx
 
# 디렉토리 재귀 검색
grep -r "useState" src/
 
# 줄 번호 표시
grep -rn "useState" src/
 
# 대소문자 무시
grep -rni "todo" src/
 
# 정규식
grep -rn "use[A-Z][a-zA-Z]*" src/
 
# 매칭된 줄만 (앞뒤 컨텍스트 없이)
grep -rn --include="*.ts" "import" src/

자주 쓰는 옵션은 -r(재귀), -n(줄번호), -i(대소문자 무시), --include(파일 패턴 제한).

3) fdfind의 현대적 대체

brew install fd     # macOS
sudo apt install fd-find   # Ubuntu (명령어는 fdfind)

기본 사용법이 find보다 직관적이다.

# 단순 검색 — 자동 재귀, 자동 .gitignore 무시
fd Header
 
# 확장자
fd -e tsx
 
# 파일 타입
fd -t f Header   # 파일만
fd -t d test     # 디렉토리만
 
# 숨김 파일 포함
fd -H .env
 
# 대소문자 무시 (기본은 smart-case: 소문자 입력하면 무시)
fd -i header
 
# 명령 실행
fd -e log -x rm

find와 비교하면:

# find
find . -name "*.tsx" -not -path "*/node_modules/*" -not -path "*/.next/*"
 
# fd
fd -e tsx

node_modules 제외를 사용자가 신경 쓸 필요 없다.

4) ripgrep (rg) — grep의 현대적 대체

brew install ripgrep
sudo apt install ripgrep
# 기본 — 현재 디렉토리 재귀, .gitignore 자동 적용
rg useState
 
# 파일 타입 지정
rg useState -t ts
 
# 특정 디렉토리만
rg useState src/components/
 
# 매칭 카운트
rg -c useState
 
# 파일 이름만
rg -l useState
 
# 컨텍스트 (앞뒤 줄)
rg -C 3 useState
 
# 대소문자 무시
rg -i todo
 
# 정규식 OK (기본 활성)
rg "use[A-Z]\w+"
 
# 한 단어로
rg -w error

VS Code의 검색 기능이 내부적으로 rg를 쓴다. 큰 모노레포에서 grep -r이 30초 걸리는 검색이 rg로는 1초 안에 끝난다.

실전 패턴 5개

A. "그 컴포넌트 어디 있는지"

fd -t f PostCard

B. "어디서 import 되는지"

rg -l "from ['\"].*PostCard['\"]"

C. "TODO만 모아보기"

rg -n "TODO|FIXME"

D. "최근 일주일 안에 바뀐 마크다운"

fd -e md --changed-within 7d

E. "특정 함수 호출 + 컨텍스트 3줄"

rg -C 3 "useEffect"

정리 — 어떤 걸 쓰면 되나

개인 머신 / 프로젝트 작업: fd + rg 조합이 압도적으로 빠르고 편하다.
서버 / 컨테이너 / CI 환경: find + grep 만 깔려있는 경우가 많다. 둘 다 쓸 줄 알아야 한다.
한 줄 요약: 평소엔 fd/rg, 어디서든 동작해야 할 땐 find/grep.

findgrep은 외워두지 않으면 매번 검색하게 된다. man이 길다 싶으면 tldr 글에서 본 것처럼 tldr find, tldr rg를 먼저 띄워보면 자주 쓰는 패턴만 추려 보인다.

참고

Comments