fzf는 터미널에서 목록을 대화형으로 좁혀 찾게 해주는 퍼지 파인더(fuzzy finder)다. 파이프로 들어온 어떤 텍스트 목록이든 받아서, 타이핑할 때마다 실시간으로 후보를 필터링하고, 고른 항목을 표준 출력으로 내보낸다. 파일 찾기, 명령어 히스토리 검색, git 브랜치 전환, 프로세스 종료까지 — "목록에서 하나 고르기"인 거의 모든 작업을 순식간에 바꿔놓는다.
처음 fzf를 깔았을 때는 솔직히 별거 아니라고 생각했다. 그냥 예쁜 검색창이잖아? 그런데 한 달쯤 쓰고 나니 fzf 없는 터미널이 답답해서 못 견디게 됐다. 핵심은 "정확한 이름을 기억할 필요가 없다"는 데 있다.
퍼지 매칭이 뭐가 다른가
일반 검색은 부분 문자열이 정확히 이어져야 한다. fzf는 입력한 글자들이 순서대로 등장하기만 하면 매칭된다. 예를 들어 ktrl이라고 치면 src/components/KanbanController.tsx가 걸린다. k, t, r, l이 그 순서로 들어있으니까. 파일이 어느 폴더에 있는지, 정확한 철자가 뭔지 몰라도 대충 특징적인 글자만 흘리면 찾아진다.
이게 익숙해지면 사고방식이 바뀐다. 경로를 외우거나 cd로 한 단계씩 내려가는 대신, 특징적인 글자 몇 개를 던지고 화살표로 고른다.
기본 사용법
fzf는 그 자체로 필터다. 어떤 명령의 출력을 파이프로 넘기면 대화형 선택창이 뜬다.
# 파일 하나 골라서 vim으로 열기
vim $(fzf)
# 현재 폴더 이하 파일을 미리보기와 함께
fzf --preview 'cat {}'
# 프로세스 골라서 죽이기
kill -9 $(ps -ef | fzf | awk '{print $2}')
--preview는 진짜 물건이다. 선택 커서를 옮길 때마다 오른쪽에 해당 항목의 내용을 보여준다. {}가 현재 커서에 놓인 항목으로 치환된다. 파일이면 내용을, 브랜치면 커밋 로그를, JSON이면 파싱 결과를 미리 볼 수 있다.
셸에 심는 기본 단축키
fzf를 설치하고 셸 통합을 켜면(fzf --bash 또는 zsh 설정) 세 가지 마법 키가 생긴다. 이것만으로도 설치할 값어치는 충분하다.
| 단축키 | 기능 |
|---|---|
| Ctrl-R | 명령어 히스토리 퍼지 검색 (기본 Ctrl-R을 대체) |
| Ctrl-T | 현재 위치 이하 파일을 골라 커맨드라인에 삽입 |
| Alt-C | 하위 디렉터리를 골라 곧바로 cd |
개인적으로 Ctrl-R 하나만으로도 삶이 바뀌었다. 기본 Ctrl-R은 한 번에 하나씩 뒤로 넘겨야 하는데, fzf 버전은 며칠 전 그 긴 docker run 명령을 특징 단어 하나로 즉시 불러온다. "그 명령 뭐였더라" 하며 히스토리를 스크롤하던 시간이 사라졌다.
실전 조합 몇 가지
fzf의 진짜 힘은 다른 도구와 엮을 때 나온다. 나는 아래 두 개를 함수로 만들어 alias에 넣어뒀다.
# git 브랜치를 골라서 체크아웃 (로그 미리보기 포함)
gco() {
git branch --all | grep -v HEAD |
fzf --preview 'git log --oneline --color=always {1}' |
sed 's/^..//;s#remotes/[^/]*/##' | xargs git checkout
}
# ripgrep으로 코드 검색하고 결과를 골라 vim으로 점프
frg() {
local file
file=$(rg --line-number . |
fzf --delimiter : --preview 'bat --color=always {1} --highlight-line {2}')
[ -n "$file" ] && vim +$(echo "$file" | cut -d: -f2) "$(echo "$file" | cut -d: -f1)"
}
여기서 감이 올 것이다. fzf는 목록을 만드는 도구가 아니라, 남이 만든 목록에서 고르는 도구다. ripgrep이 검색하고, git이 브랜치를 뽑고, fzf는 그 결과를 사람이 눈으로 좁히게 도와준다. 각 도구가 한 가지만 잘하는 유닉스 철학의 좋은 예다.
몇 가지 팁과 함정
--height 40%를 기본 옵션(FZF_DEFAULT_OPTS)에 넣으면 전체 화면을 안 잡아먹고 하단에만 뜬다. 훨씬 쾌적하다.- 정확 매칭이 필요하면 검색어 앞에
'를 붙인다.'main은 main을 정확히 포함한 것만 찾는다. - 여러 개를 고르려면
--multi(또는-m)를 켜고 Tab으로 다중 선택한다. - 파일 소스로는
find보다fd를 쓰면.gitignore를 존중해서 빌드 산출물 같은 노이즈가 안 섞인다.
자주 묻는 질문
fzf와 ripgrep은 무슨 차이인가요?
역할이 다릅니다. ripgrep은 파일 내용을 빠르게 검색해 매칭 라인을 뽑아내는 도구이고, fzf는 이미 만들어진 목록에서 대화형으로 하나를 고르는 도구입니다. 둘을 파이프로 엮으면 "검색 후 결과에서 선택"이라는 강력한 워크플로가 됩니다.
기본 Ctrl-R을 덮어써도 괜찮나요?
대부분 괜찮습니다. fzf의 Ctrl-R은 기존 역방향 히스토리 검색의 상위 호환이라 잃는 게 거의 없습니다. 셸 통합 스크립트를 로드하면 자동으로 바인딩되며, 원치 않으면 통합을 끄고 fzf를 명령으로만 쓸 수도 있습니다.
미리보기 창에 색이 안 나와요.
미리보기 명령에 색상 출력 옵션을 줘야 합니다. cat 대신 bat --color=always, git 명령에는 --color=always를 붙이세요. fzf 자체는 받은 텍스트를 그대로 보여줄 뿐, 색을 입히지는 않습니다.
선택을 취소하고 싶으면요?
Esc 또는 Ctrl-C를 누르면 아무것도 선택하지 않고 빠져나옵니다. 이때 fzf는 빈 문자열을 반환하므로, 스크립트에서 [ -n "$var" ]로 취소 여부를 확인하는 습관을 들이면 안전합니다.

댓글 0