현대적 CLI 도구 란?
grep, find, cat은 수십 년간 터미널의 기본기였습니다. 여전히 강력하지만, 옵션이 까다롭고 대형 저장소에서는 느리며 출력도 투박합니다. 최근 Rust 등으로 다시 작성된 도구들은 같은 일을 더 빠르고, 더 합리적인 기본값으로, 더 보기 좋게 처리합니다.
| 고전 도구 | 현대 대체 | 핵심 차이 |
|---|---|---|
grep | rg (ripgrep) | 빠름, .gitignore 자동 존중, 재귀가 기본 |
find | fd | 간결한 문법, 색상 출력, 빠른 탐색 |
cat | bat | 문법 강조, 줄 번호, Git 변경 표시 |
| (없음) | fzf | 대화형 퍼지 파인더 — 다른 명령과 결합 |
이들은 고전 도구를 "대체"하기보다, 일상 작업에서 손이 더 빨리 가는 보완재로 쓰는 것이 좋습니다.
설치
# macOS (Homebrew)
brew install ripgrep fd fzf bat
# Debian / Ubuntu
sudo apt install ripgrep fd-find bat
# fzf는 깃 클론 설치가 셸 통합까지 해줘 편리
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install
# Arch
sudo pacman -S ripgrep fd fzf batDebian/Ubuntu에서는 패키지 충돌 때문에 fd가 fdfind, bat이 batcat이라는 이름으로 설치됩니다. alias fd=fdfind, alias bat=batcat를 ~/.bashrc에 추가해 두면 편합니다.
ripgrep (rg) — grep을 대체하는 코드 검색
rg는 디렉터리를 재귀적으로, .gitignore·.ignore·숨김 파일을 자동으로 제외하며 검색합니다. 그래서 별다른 옵션 없이도 코드베이스 검색에 바로 알맞습니다.
# grep 방식: 재귀 + 줄번호 + 색상을 일일이 지정
grep -rn --color "TODO" .
# rg 방식: 이 모든 게 기본값
rg TODO자주 쓰는 옵션:
rg "fetchUser" -t js # JavaScript 파일만 (-t 타입)
rg "error" -i # 대소문자 무시
rg "config" -g "*.yaml" # glob으로 파일 한정
rg "deprecated" -l # 매칭된 파일 이름만
rg "handler" -A 3 -B 1 # 매칭 줄 앞 1줄, 뒤 3줄 함께
rg "v\\d+\\.\\d+" -o # 매칭 부분만 출력 (정규식)
rg --hidden --no-ignore "key" # 숨김 파일·무시 파일까지 포함| 항목 | grep | ripgrep(rg) |
|---|---|---|
| 재귀 검색 | -r 필요 | 기본 |
| .gitignore 존중 | 안 함 | 자동 |
| 속도 | 보통 | 매우 빠름(병렬) |
| 파일 타입 필터 | 없음 | -t js, -t py |
| 기본 출력 | 단색 | 색상·줄번호 |
fd — find를 대체하는 파일 탐색
find는 표현력은 뛰어나지만 문법이 장황합니다. fd는 가장 흔한 사용 패턴을 짧고 직관적으로 만듭니다.
# find: 정형화된 장황한 문법
find . -type f -name "*.log"
# fd: 패턴만 적으면 됨 (부분 일치, 정규식)
fd "\\.log$"
fd config # 이름에 config 포함된 항목자주 쓰는 옵션:
fd -e log # 확장자 log (-e)
fd -t f report # 파일만 (-t f), 디렉터리는 -t d
fd -H secret # 숨김 파일 포함 (-H)
fd -I node_modules # .gitignore 무시하고 포함 (-I)
fd pattern src/ # 특정 디렉터리에서
fd -e tmp -x rm {} # 매칭마다 명령 실행 (-x, find의 -exec 대응)| 항목 | find | fd |
|---|---|---|
| 기본 문법 | -name, -type 명시 | 패턴만 |
| 매칭 | 정확/glob | 부분 일치·정규식 |
| .gitignore | 무시 안 함 | 자동 존중 |
| 출력 | 단색 | 색상 구분 |
| 명령 실행 | -exec ... \; | -x / -X |
bat — cat을 대체하는 파일 뷰어
bat은 cat처럼 파일을 출력하되 문법 강조, 줄 번호, Git 변경 표시를 더합니다. 출력이 화면보다 길면 자동으로 페이저(less)에 연결됩니다.
bat src/app.js # 문법 강조 + 줄번호
bat -p log.txt # plain 모드 (장식 없이, cat처럼)
bat -A config.txt # 공백·탭 등 비표시 문자 표시
bat -r 10:30 server.log # 10~30번째 줄만
bat -l yaml deploy.tpl # 언어 강제 지정파이프 안에서 색상을 강제로 유지하려면 --color=always를 씁니다.
rg -l "TODO" | xargs bat| 항목 | cat | bat |
|---|---|---|
| 문법 강조 | 없음 | 있음 |
| 줄 번호 | -n만 | 기본 |
| Git diff 표시 | 없음 | 변경 줄 마커 |
| 페이징 | 없음 | 자동(less) |
| 스크립트용 출력 | 그대로 | -p로 동일하게 |
bat은 사람이 읽기 좋은 도구입니다. 스크립트나 파이프에서 순수 텍스트가 필요하면 -p(plain) 또는 그냥 cat을 쓰세요. 장식 문자가 섞이면 후속 처리가 깨질 수 있습니다.
fzf — 대화형 퍼지 파인더
fzf는 위 도구들과 성격이 다릅니다. 표준 입력으로 받은 목록을 대화형으로 좁혀가며(fuzzy) 선택하게 해 주는 만능 필터입니다. 다른 명령의 출력을 받아 결합할 때 진가를 발휘합니다.
# 파일을 골라 vim으로 열기
vim $(fzf)
# fd 결과를 fzf로 고르고 bat으로 미리보기
fd -t f | fzf --preview 'bat --color=always {}'
# git 브랜치 대화형 선택 후 체크아웃
git branch | fzf | xargs git checkout
# 프로세스 선택해서 종료
ps -ef | fzf | awk '{print $2}' | xargs kill타이핑하면 부분 문자열이 흩어져 있어도 매칭되고, 방향키로 후보를 고른 뒤 Enter로 선택합니다.
셸 통합 — 진짜 속도가 나는 부분
fzf는 설치 스크립트가 셸 키바인딩과 자동완성을 등록해 줍니다. ~/.bashrc 또는 ~/.zshrc에 다음을 추가합니다.
# bash
[ -f ~/.fzf.bash ] && source ~/.fzf.bash
# zsh
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh그러면 다음 키바인딩이 활성화됩니다.
| 키 | 동작 |
|---|---|
Ctrl-R | 명령 히스토리를 퍼지 검색 |
Ctrl-T | 현재 디렉터리 파일을 골라 명령줄에 삽입 |
Alt-C | 하위 디렉터리로 퍼지 cd |
fzf의 파일 탐색 백엔드를 fd로 바꾸면 더 빠르고 .gitignore도 존중합니다.
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_DEFAULT_OPTS="--height 40% --reverse --border"자주 쓰는 함수 별칭 예:
# 코드에서 검색어를 입력하며 실시간으로 rg + 미리보기
rgf() {
rg --line-number --no-heading --color=always "${1:-}" |
fzf --ansi --preview 'bat --color=always {1} --highlight-line {2}'
}함께 쓰는 워크플로우 예
# 1) "deprecated"가 들어간 파일을 찾아, 골라서, 강조 출력으로 확인
rg -l deprecated | fzf --preview 'bat --color=always {}'
# 2) 로그 디렉터리에서 .log 파일을 골라 마지막 부분만 보기
fd -e log /var/log | fzf | xargs tail -n 50
# 3) 함수 정의를 검색해 위치로 점프 (에디터 연동)
rg "function " -n | fzf정리
| 도구 | 대체 대상 | 한 줄 요약 |
|---|---|---|
rg | grep | 빠르고 .gitignore를 아는 재귀 검색 |
fd | find | 패턴만 적으면 되는 직관적 파일 탐색 |
bat | cat | 문법 강조·줄번호·Git 표시 뷰어 |
fzf | — | 모든 목록을 대화형으로 좁히는 퍼지 파인더 |
이 네 도구는 각각도 유용하지만, rg | fzf --preview bat처럼 파이프로 조합할 때 가장 강력합니다. 고전 도구를 버릴 필요는 없습니다. 스크립트의 호환성·이식성이 중요하면 grep/find/cat을, 사람이 직접 탐색하는 일상 작업에는 현대 도구를 쓰는 식으로 역할을 나누면 됩니다.
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.