이번 포스팅에서는 터미널 생산성을 끌어올리는 모던 CLI 도구에 대해서 정리하고자 한다. grep, find, cat, ls처럼 수십 년간 쓰여 온 유닉스 기본 명령어를 Rust 기반의 최신 도구로 교체하면 검색 속도가 수십 배 빨라지고, 구문 강조와 퍼지 매칭 같은 기능이 터미널 워크플로에 자연스럽게 녹아든다. 여기서 다루는 모던 CLI 도구는 fzf, ripgrep, bat, fd, zoxide, eza, Starship 총 7종이며, macOS와 Linux에서 Homebrew 한 줄로 설치할 수 있다.
모던 CLI 도구를 써야 하는 이유 — 벤치마크가 말해 준다

문제는 대부분의 개발자가 여전히 grep, find, cat, ls 같은 1970~80년대에 만들어진 기본 명령어를 그대로 쓰고 있다는 점이다. 이 도구들이 나쁜 것은 아니지만, .gitignore를 무시하고 바이너리 파일까지 뒤지는 grep, 직관적이지 않은 플래그 조합이 필요한 find, 구문 강조 없이 텍스트만 뱉는 cat은 2026년 기준으로 분명 더 나은 대안이 있다.

fzf — 이거 하나면 히스토리 검색이 달라진다
fzf는 커맨드라인 퍼지 파인더다. 파일 목록이든 명령어 히스토리든 Git 브랜치든, 텍스트로 된 리스트라면 뭐든 실시간 퍼지 매칭으로 걸러준다. GitHub 스타가 79,200개를 넘었고, 이 글에서 소개하는 모던 CLI 도구 중 사용자가 가장 많다.
퍼지매칭(Fuzzy Matching), 퍼지검색(Fuzzy Search)은 데이터 내에서 정확하게 일치하지 않더라도 유사한 항목을 찾아내는 기술을 의미한다. 사용자의 오타, 실수, 혹은 이름 표기법의 차이(예: “Google” vs “Gogle”)가 발생했을 때 이를 유연하게 보정하여 원하는 결과를 보여주는 것이 핵심이다.
설치
# macOS
brew install fzf
# Ubuntu/Debian
sudo apt install fzf
# Arch Linux
sudo pacman -S fzfShellScript패키지 매니저로 설치하면 단일 바이너리 하나가 추가된다. Homebrew 기준 의존성이 없어서 설치가 깔끔하다.
쉘 통합 설정
fzf를 설치만 하고 끝내면 반쪽짜리다. .zshrc(또는 .bashrc)에 아래 한 줄을 추가해야 쉘 키바인딩이 활성화된다.
# Zsh 사용자
source <(fzf --zsh)
# Bash 사용자
eval "$(fzf --bash)"ShellScript이 한 줄로 세 가지 키바인딩이 활성화된다.
| 단축키 | 기능 | 설명 |
|---|---|---|
CTRL-R | 명령어 히스토리 검색 | 이전에 실행한 명령어를 퍼지 매칭으로 탐색 |
CTRL-T | 파일/디렉토리 선택 | 현재 디렉토리 하위 파일을 퍼지 검색으로 선택 |
ALT-C | 디렉토리 이동 | 하위 디렉토리를 퍼지 검색으로 찾아서 cd |

커스텀 설정
# fd를 기본 파일 탐색기로 사용 (숨김 파일, .gitignore 제외)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
# 레이아웃을 역방향으로, 미리보기를 bat으로 연동
export FZF_DEFAULT_OPTS="
--layout=reverse
--info=inline
--preview 'bat --color=always --line-range=:500 {}'
--preview-window=right:60%
"
# CTRL-T에서도 fd 사용
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"ShellScriptfzf가 파일을 찾을 때 fd를 쓰고, 미리보기를 bat으로 보여주는 설정이다. --preview가 들어가면 파일을 선택하기 전에 구문 강조된 내용을 바로 볼 수 있다. 파일을 열었다 닫는 반복이 사라지는 게 이 조합(fzf + fd + bat)의 핵심이다.
ripgrep — grep -r을 치는 자신이 답답해지는 순간
ripgrep(명령어: rg)은 모던 CLI 도구 중에서도 체감 효과가 가장 큰 재귀적 정규식 검색 도구다. .gitignore를 알아서 무시하고, 바이너리 파일과 숨김 디렉토리는 기본적으로 건너뛴다. GitHub 스타 61,900개.
설치
# macOS
brew install ripgrep
# Ubuntu/Debian
sudo apt-get install ripgrepShellScript성능 벤치마크
리눅스 커널 소스 코드에서 패턴 검색을 돌린 공식 벤치마크 결과는 다음과 같다.
| 도구 | 소요 시간 | 비고 |
|---|---|---|
| GNU grep (유니코드) | 2.670초 | 기본 grep |
| The Silver Searcher (ag) | 0.443초 | ag |
| ripgrep (rg) | 0.082초 | Rust + SIMD 최적화 |

실전 사용 예시
# Java 파일에서 TODO 검색
rg 'TODO' --type java
# 로그 파일에서 대소문자 구분 없이 error 검색
rg -i 'error' --glob '*.log'
# 특정 디렉토리에서 함수 정의 찾기
rg 'public.*void' src/main/java/
# 숨김 파일까지 포함해서 검색
rg --hidden 'API_KEY'
# 검색 결과에서 파일명만 출력
rg -l 'deprecated' --type javaShellScript.ripgreprc 설정
# ~/.ripgreprc 파일 생성
echo '--smart-case
--hidden
--glob=!.git/' > ~/.ripgreprc
# 환경변수로 설정 파일 경로 지정 (.zshrc에 추가)
export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"ShellScript--smart-case는 검색어가 모두 소문자면 대소문자를 무시하고, 대문자가 하나라도 포함되면 대소문자를 구분한다. 별도 플래그 없이 대부분의 검색 시나리오를 커버하는 실용적인 기본값이다.
bat — cat에 색을 입히면 생각보다 많이 다르다
bat은 cat의 Rust 대체제로, 구문 강조와 Git 변경 표시를 기본 제공한다. GitHub 스타 58,000개 이상.
설치
# macOS
brew install bat
# Ubuntu/Debian (주의: 패키지명이 bat이 아닌 경우 있음)
sudo apt install bat
# Debian/Ubuntu에서 batcat으로 설치되면 아래처럼 심볼릭 링크 생성
mkdir -p ~/.local/bin && ln -s /usr/bin/batcat ~/.local/bin/batShellScriptUbuntu에서는 패키지 이름 충돌 때문에 batcat으로 설치될 수 있다. 이 경우 심볼릭 링크를 만들어 bat 명령어로 통일하면 된다.
핵심 기능
# 기본 사용: 구문 강조 + 줄번호 + Git 변경 표시
bat src/main/java/Application.java
# 여러 파일 한 번에 보기
bat src/*.java
# 파이프 입력도 지원 (언어 자동 감지)
curl -s https://api.github.com/repos/sharkdp/bat | bat -l json
# 비인쇄 문자 표시 (탭, 줄바꿈 등)
bat -A config.ymlShellScript
fzf와 연동
# fzf에서 파일 미리보기를 bat으로 표시
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'ShellScriptCTRL-T를 누르면 파일 목록이 뜨고, 커서를 옮길 때마다 오른쪽에 구문 강조된 내용이 실시간으로 나타난다. 이 조합을 한 번 써보면 예전 방식으로 안 돌아간다.
alias 설정
# .zshrc에 추가
alias cat='bat --paging=never'
alias less='bat --paging=always'ShellScriptfd — find의 플래그 조합에서 해방되는 법
fd는 find를 대체한다. find를 쓸 때마다 -name, -not -path, -type f 같은 플래그 순서를 검색하게 된다면 fd가 답이다. GitHub 스타 42,300개.
설치
# macOS
brew install fd
# Ubuntu/Debian
sudo apt install fd-find
# fd-find로 설치되면 심볼릭 링크 생성
mkdir -p ~/.local/bin && ln -s $(which fdfind) ~/.local/bin/fdShellScript성능 벤치마크
75만 개 디렉토리, 400만 개 파일이 있는 파일 시스템에서 측정한 결과다.
| 도구 | 소요 시간 | 배율 |
|---|---|---|
| find (정규식) | 19.9초 | 기준 |
| find (글로브) | 11.2초 | 1.8배 |
| fd (정규식) | 0.855초 | 23배 |
fd가 이렇게 빠른 이유는 병렬 디렉토리 순회와 .gitignore 자동 무시 덕분이다. 대규모 프로젝트에서 node_modules나 build 디렉토리를 알아서 건너뛰기 때문에(Docker 이미지 최적화와 함께 쓰면 빌드 환경이 깔끔해진다) 실질적인 체감 속도 차이는 벤치마크 수치보다 더 크다.
실전 사용 예시
# 확장자로 파일 찾기
$> fd -e yml
src/main/resources/application.yml
src/test/resources/application.yml
# 특정 디렉토리에서 패턴 검색
$> fd 'Service' src/main/
src/main/java/com/mail/smtp/mta/protocol/ProtocolService.java
src/main/java/com/mail/smtp/service/MimeParseService.java
src/main/java/com/mail/smtp/service/QueuingService.java
src/main/java/com/mail/smtp/service/RelayService.java
src/main/java/com/mail/smtp/service/SaveMailService.java
src/main/java/com/mail/smtp/service/UserService.java
# 숨김 파일 포함 검색
$> fd -H '.DS_Store'
.DS_Store
src/.DS_Store
src/main/.DS_Store
# 찾은 파일에 일괄 명령 실행
$> fd -e log -X rm
# .DS_Store 파일 전부 삭제
$> fd -H '\.DS_Store' -tf -X rm
# 검색 결과를 fzf로 넘기기
$> fd --type f | fzfShellScriptfd -e java처럼 확장자만 지정하면 되는 간결한 문법이 fd의 강점이다. find로 같은 동작을 하려면 find . -name "*.java" -not -path "./.git/*"처럼 길어진다. -X 플래그는 검색 결과 전체를 한 번에 명령어의 인자로 넘기고, -x는 결과마다 개별적으로 실행한다는 차이가 있다.
fzf 기본 탐색기로 fd 설정
# .zshrc에 추가 — fzf가 파일을 탐색할 때 fd를 사용
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
export FZF_ALT_C_COMMAND='fd --type d --hidden --exclude .git'ShellScriptzoxide — cd에 경로 전체를 치는 시대는 끝났다
zoxide는 cd를 대체하는 모던 CLI 도구다. 자주 가는 디렉토리를 frecency(frequency + recency) 알고리즘으로 학습하고, 경로 일부만 쳐도 원하는 곳으로 점프한다. GitHub 스타 35,000개 이상.
설치 및 쉘 통합
# macOS
brew install zoxide
# .zshrc에 추가 (반드시 파일 맨 끝에 위치)
eval "$(zoxide init zsh)"
# Bash 사용자
eval "$(zoxide init bash)"ShellScriptzoxide init은 .zshrc 파일의 뒷부분에 두어야 한다. Starship을 함께 쓴다면 starship init 바로 위에 배치한다.zoxide init 명령은 사용자의 쉘이 실행될 때 zoxide가 시스템에 통합되도록 설정하는 스크립트를 생성하고 등록하는 역할을 한다. 간단히 말해 zoxide가 단순한 프로그램을 넘어 쉘의 기본 동작 방식(cd 명령어등)을 확장할 수 있게 통로를 열어주는 작업을 한다.
- 별칭 설정 : ‘z’ 명령어를 사용할 수 있도록 한다.
- 경로 기록용 훅 등록 : 사용자가 cd 명령어로 디렉토리를 이동할 때마다 그 경로를 zoxide의 데이터베이스에 자동으로 기록하도록 훅을 걸어둔다.
- 자동완성 활성화: z를 입력하고 tab 키를 눌렀을 때 데이터베이스에 저장된 경로 중 일치하는 후보군을 보여주는 스크립트를 로드한다.
사용법
# 'project'가 포함된 가장 자주 방문한 디렉토리로 이동
z project
# 여러 키워드로 좁히기
z my project
# 인터랙티브 모드 (fzf 연동)
zi project
# 상위 디렉토리로 이동 (cd .. 대체)
z ..
# 이전 디렉토리로 이동 (cd - 대체)
z -ShellScriptz project를 입력하면 zoxide가 내부 데이터베이스에서 ‘project’를 포함하는 경로 중 frecency 점수가 가장 높은 디렉토리로 이동한다. 예를 들어 /home/user/workspace/my-spring-project를 자주 방문했다면, z spring만 입력해도 해당 경로로 바로 점프한다. zi는 후보가 여러 개일 때 fzf 인터페이스로 선택할 수 있게 해준다.
기존 도구 데이터 마이그레이션
# autojump에서 데이터 가져오기
zoxide import --from autojump ~/.local/share/autojump/autojump.txt
# z.sh에서 데이터 가져오기
zoxide import --from z ~/.zShellScript
eza + Starship으로 완성하는 터미널 환경
여기까지가 핵심 5종이고, ls와 쉘 프롬프트도 바꾸면 터미널이 한층 쾌적해진다.
eza — Git 상태가 보이는 ls
eza는 exa의 후속 프로젝트로, ls를 대체하는 파일 목록 도구다. GitHub 스타 21,000개.
# 설치
brew install eza
# 기본 사용
eza -la # 상세 목록 + 숨김 파일
eza --tree --level=2 # 트리 뷰 (2단계 깊이)
eza -la --git # Git 상태 표시
eza --icons=always # 파일 아이콘 표시 (Nerd Font 필요)
# 주의: 아이콘을 표시하기 위한 nerd font를 설치하지 않으면 아이콘 표시 부분에 '?' 표시가 된다.
# brew install --cask font-jetbrains-mono-nerd-font
# 위 명령으로 nerd font 설치 후 터미널 설정에서 nerd font를 지정해주면 된다.ShellScripteza가 기본 ls보다 유용한 이유는 Git 통합이다. -la --git으로 출력하면 각 파일 옆에 Git 상태(M, N, -)가 표시되어 어떤 파일이 수정되었고 어떤 파일이 추적되지 않는지 한눈에 보인다.
# .zshrc에 alias 추가
alias ls='eza --icons=always'
alias ll='eza -la --icons=always --git'
alias lt='eza --tree --level=2 --icons=always'ShellScriptStarship — 크로스쉘 프롬프트
Starship은 Rust로 작성된 쉘 프롬프트다. 프롬프트 렌더링이 빠르고, 설정 파일 하나로 커스터마이징이 된다. GitHub 스타 55,800개. Bash, Zsh, Fish, PowerShell 등 12개 이상의 쉘에서 동작한다.
# 설치
brew install starship
# .zshrc 맨 끝에 추가
eval "$(starship init zsh)"ShellScript별도 설정 없이도 현재 디렉토리의 Git 브랜치, Node.js/Java/Python 버전, 실행 시간 등을 프롬프트에 자동 표시한다. AI 개발 도구와 조합하면 터미널 기반 워크플로가 완성된다.
Starship 커스텀 설정
# ~/.config/starship.toml
# 프롬프트 포맷 커스터마이징
format = """
$directory$git_branch$git_status$java$nodejs$python$cmd_duration
$character"""
# 디렉토리 표시 깊이 제한
[directory]
truncation_length = 3
truncation_symbol = ".../"
# Git 브랜치
[git_branch]
format = "[$branch]($style) "
style = "bold purple"
# Java 버전 표시
[java]
format = "[${symbol}${version}]($style) "
symbol = "☕ "
# 명령어 실행 시간 (2초 이상일 때만 표시)
[cmd_duration]
min_time = 2_000
format = "took [$duration]($style) "TOML.zshrc 하나로 모던 CLI 도구 7종 통합 세팅하기
도구별로 따로 설명했지만, 실제로는 한 번에 몰아서 설치하고 .zshrc에 설정을 모아두는 게 낫다.
Homebrew 일괄 설치
# macOS / Linux (Linuxbrew) 공통
brew install fzf ripgrep bat fd zoxide eza starshipShellScript한 줄이면 7개 도구가 전부 설치된다. Homebrew가 없다면 https://brew.sh에서 먼저 설치한다.
.zshrc 통합 설정
# ============================================
# 모던 CLI 도구 통합 설정
# ============================================
# --- fzf 설정 ---
source <(fzf --zsh)
# fzf 기본 탐색을 fd로 변경
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='fd --type d --hidden --exclude .git'
# fzf 미리보기를 bat으로 설정
export FZF_DEFAULT_OPTS="
--layout=reverse
--info=inline
--preview 'bat --color=always --style=numbers --line-range=:500 {}'
--preview-window=right:60%
--bind 'ctrl-/:toggle-preview'
"
# --- ripgrep 설정 ---
export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"
# --- bat 설정 ---
export BAT_THEME="Dracula" # 테마 설정 (bat --list-themes로 확인)
alias cat='bat --paging=never'
# --- eza 설정 ---
alias ls='eza --icons=always'
alias ll='eza -la --icons=always --git'
alias lt='eza --tree --level=2 --icons=always'
# --- zoxide 설정 ---
eval "$(zoxide init zsh)"
# --- Starship 프롬프트 (반드시 .zshrc 맨 끝에 위치) ---
eval "$(starship init zsh)"ShellScript주의할 점은 순서다. starship init은 프롬프트 훅을 건드리기 때문에 .zshrc의 맨 마지막 줄이어야 한다. zoxide init은 그 바로 위에 둔다. oh-my-zsh이나 zinit 같은 플러그인 매니저를 쓰고 있다면 그 뒤에 배치한다. fzf --zsh는 위치에 민감하지 않아서 중간에 둬도 괜찮다.
.ripgreprc 설정 파일
# ~/.ripgreprc
--smart-case
--hidden
--glob=!.git/
--glob=!node_modules/
--glob=!target/
--glob=!build/ShellScript--smart-case는 소문자만 입력하면 대소문자를 무시하고, 대문자가 섞이면 정확히 매칭한다. 거의 모든 검색 상황에서 원하는 대로 동작하는 옵션이다. --glob=!으로 node_modules, target, build 같은 빌드 산출물을 기본 제외해 두면 매번 플래그를 안 달아도 된다.
도구 간 연동 관계
fzf (퍼지 파인더)
├── fd → 파일/디렉토리 탐색 백엔드 (FZF_DEFAULT_COMMAND)
├── bat → 파일 미리보기 (--preview)
└── zoxide → zi 명령어의 인터랙티브 모드
ripgrep
└── bat → rg 결과를 bat으로 하이라이트 (batgrep)
eza
└── 독립 실행 (ls 대체)
Starship
└── 독립 실행 (프롬프트)Plaintext
설치 확인 및 동작 테스트
모든 설정을 마치고 나면 아래 명령어로 정상 동작을 확인한다.
# 각 도구 버전 확인
$> fzf --version && rg --version && bat --version && fd --version && zoxide --version && eza --version && starship --version
0.70.0 (Homebrew)
ripgrep 15.1.0
features:+pcre2
simd(compile):+NEON
simd(runtime):+NEON
PCRE2 10.45 is available (JIT is available)
bat 0.26.1
fd 10.4.2
zoxide 0.9.9
eza - A modern, maintained replacement for ls
v0.23.4 [+git]
https://github.com/eza-community/eza
starship 1.24.2
branch:
commit_hash:
build_time:2025-12-30 19:11:40 +00:00
build_env:rustc 1.93.0 (254b59607 2026-01-19) (Homebrew)
# fzf 키바인딩 테스트
# CTRL-R → 히스토리 검색 창이 뜨는지 확인
# CTRL-T → 파일 목록 + bat 미리보기가 나오는지 확인
# ripgrep 테스트
$> rg --type-list | rg 'java' # java 파일 타입 인식 확인
java: *.java, *.jsp, *.jspx, *.properties
# zoxide 테스트
zoxide --version # 설치 확인
cd /tmp && cd ~ && z tmp # /tmp로 점프되는지 확인ShellScript전부 통과했으면 모던 CLI 도구 세팅은 끝이다. 처음에는 CTRL-R과 z부터 의식적으로 써 보는 게 좋다. 이 두 가지만 습관이 되어도 하루에 수십 번 반복하는 히스토리 검색과 디렉토리 이동이 체감될 만큼 빨라진다.

마치며
처음 모던 CLI 도구를 세팅한 건 한 동료가 fzf를 쓰는 걸 옆에서 본 날이었다. CTRL-R을 누르자 히스토리가 실시간으로 필터링되는 걸 보고, 그때까지 history | grep을 치고 있던 자신이 좀 부끄러웠다. 그 뒤로 ripgrep, bat, fd를 차례로 도입했는데, 한 번 쓰기 시작하면 기본 명령어로 돌아갈 수가 없다. 특히 ripgrep은 대규모 모노레포에서 grep -r이 10초 넘게 걸리던 검색을 0.1초 안에 끝내줘서, 코드 리뷰할 때 흐름이 끊기지 않는 점이 좋았다. 팀원들에게도 이 세팅을 공유했는데, 대부분 하루 만에 “왜 진작 안 알려줬냐”는 반응이었다. 15분이면 끝나는 세팅이니, 이 글을 보고 있다면 바로 터미널을 열어 보자.
지금까지 모던 CLI 도구 세팅에 대해서 정리해 보았다. 터미널 작업이 잦은 개발자라면 Floci 같은 로컬 개발 도구와 함께 세팅해 두면 개발 환경이 한층 쾌적해질 것이다.
