파일 검색 명령어 정리 — find, grep, fd, ripgrep
터미널에서 '그 파일 어디 있더라'와 '이 단어 어느 파일에 있더라'를 빠르게 해결하는 네 가지 도구 — find, grep, fd, ripgrep을 한 번에 정리한다.
Series
리눅스 명령어 시리즈- 1man이 너무 길 때 — tldr로 리눅스 명령어 빠르게 익히기
- 2파일 검색 명령어 정리 — find, grep, fd, ripgrep
- 3리눅스 로그 보는 명령어 정리 — tail, less, journalctl, lnav
- 4리눅스 프로세스·리소스 모니터링 — top, htop, ps, df 실전 정리
- 5리눅스 권한 정리 — chmod, chown, sudo와 그 너머
- 6리눅스 네트워크 디버깅 — ss, curl, dig, tcpdump 실전 정리
- 7SSH·SCP·Rsync — 원격 접속과 파일 동기화 한 묶음
- 8리눅스 텍스트 처리 — sed, awk, cut, sort, uniq, xargs 실전 정리
공부하게 된 계기
검색은 두 종류다.
- 파일을 찾는 검색 — "내가 만든 그
.env.local어디 있더라" - 파일 내용을 찾는 검색 — "이 함수 어디서 호출되더라"
매번 도구를 헷갈렸다. find로 내용 검색하려고 한참 애쓰다가, 결국 grep을 써야 한다는 걸 깨닫는다. 그러다 fd와 ripgrep이라는 빠른 대안이 있다는 걸 알게 됐다. 한 번에 정리해두면 두고두고 쓸 수 있어서 글로 남긴다.
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) fd — find의 현대적 대체
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 rmfind와 비교하면:
# find
find . -name "*.tsx" -not -path "*/node_modules/*" -not -path "*/.next/*"
# fd
fd -e tsxnode_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 errorVS Code의 검색 기능이 내부적으로 rg를 쓴다. 큰 모노레포에서 grep -r이 30초 걸리는 검색이 rg로는 1초 안에 끝난다.
실전 패턴 5개
A. "그 컴포넌트 어디 있는지"
fd -t f PostCardB. "어디서 import 되는지"
rg -l "from ['\"].*PostCard['\"]"C. "TODO만 모아보기"
rg -n "TODO|FIXME"D. "최근 일주일 안에 바뀐 마크다운"
fd -e md --changed-within 7dE. "특정 함수 호출 + 컨텍스트 3줄"
rg -C 3 "useEffect"정리 — 어떤 걸 쓰면 되나
개인 머신 / 프로젝트 작업: fd + rg 조합이 압도적으로 빠르고 편하다.
서버 / 컨테이너 / CI 환경: find + grep 만 깔려있는 경우가 많다. 둘 다 쓸 줄 알아야 한다.
한 줄 요약: 평소엔 fd/rg, 어디서든 동작해야 할 땐 find/grep.
find와 grep은 외워두지 않으면 매번 검색하게 된다. man이 길다 싶으면 tldr 글에서 본 것처럼 tldr find, tldr rg를 먼저 띄워보면 자주 쓰는 패턴만 추려 보인다.
참고
- fd GitHub
- ripgrep GitHub
man find,man grep(어쨌든 한 번씩은)