맥·우분투 터미널 유틸 추천: ripgrep, fd, bat, fzf, tmux 설치와 이름 함정

이 글의 핵심

개발할 때 터미널에서 자주 쓰는 유틸 아홉 개를 우분투 24.04 컨테이너에 설치해 버전과 실행 파일 이름을 확인했습니다. fd와 bat는 우분투에서 fdfind, batcat이라는 이름으로 설치되고, ripgrep은 49MB 글 폴더 검색에서 grep보다 빨랐습니다.

터미널 유틸은 많지만 자주 쓰는 것은 몇 개로 좁혀진다. 이 글은 우분투 24.04(aarch64 컨테이너)에 직접 설치해서 확인한 버전과 명령 이름을 적고, 맥 Homebrew의 패키지 이름을 함께 정리한다. 맥에서는 설치하지 않고 brew info로 패키지 존재와 최신 버전만 확인했다.

설치된 버전과 명령 이름

우분투 24.04의 apt로 설치한 결과다.

유틸apt 패키지설치된 버전실행 명령
ripgrepripgrep14.1.0rg
fdfd-find9.0.0fdfind
batbat0.24.0batcat
fzffzf0.44.1fzf
jqjq1.7jq
tmuxtmux3.4tmux
htophtop3.3.0htop
ncduncdu1.19ncdu
btopbtop1.3.0btop
zoxidezoxide0.9.3zoxide
ezaeza설치됨eza

which fd bat는 아무것도 출력하지 않았다. 즉 우분투에서 fd, bat를 그대로 입력하면 명령을 찾지 못한다. 이름을 맞추려면 다음처럼 한다.

mkdir -p ~/.local/bin
ln -s "$(command -v fdfind)" ~/.local/bin/fd
ln -s "$(command -v batcat)" ~/.local/bin/bat

~/.local/bin이 PATH에 있어야 한다. 이 링크는 컨테이너가 아니라 일반 환경에서 확인해 보길 권한다.

맥 Homebrew는 brew info 기준으로 ripgrep 15.2.0, fd 10.5.1, bat 0.26.1, fzf 0.74.5, jq 1.8.2, tmux 3.8 패키지가 있었다. 우분투 저장소 버전보다 새롭다. 맥에서 설치한 뒤 명령 이름이 어떻게 되는지는 확인하지 않았다.

유틸별 한 줄 용도

  • ripgrep(rg): 폴더 전체에서 텍스트 검색. 기본으로 .gitignore에 적힌 파일을 건너뛴다.
  • fd: 파일 이름 검색. find보다 짧은 문법을 쓴다.
  • bat: cat에 구문 강조와 줄 번호를 붙인 것.
  • fzf: 목록에서 퍼지 검색으로 고르는 도구. 명령 이력이나 파일 선택에 쓴다.
  • jq: JSON을 읽고 변환한다. API 응답을 터미널에서 확인할 때 필수에 가깝다.
  • tmux: 터미널 세션을 유지하고 화면을 분할한다. SSH가 끊겨도 작업이 남는다.
  • zoxide: 자주 가는 디렉터리로 짧은 명령으로 이동한다.
  • eza: ls의 대체. 색상과 트리 출력을 지원한다.
  • htop, btop, ncdu: 프로세스 모니터링, 디스크 사용량 확인.

ripgrep은 얼마나 빠른가

이 블로그의 글 폴더(49MB, 파일 1,132개)를 컨테이너에 읽기 전용으로 마운트해 std::mutex를 검색했다. 3번씩 반복한 결과다.

도구걸린 시간
grep -rn0.084초, 0.049초, 0.063초
rg -n0.028초, 0.021초, 0.018초

두 도구의 결과 줄 수는 841줄로 같았다. rg가 약 2.5~3배 빨랐지만 이 폴더에서는 둘 다 0.1초 안에 끝난다. 차이는 코드베이스가 커질수록 벌어질 것이지만 이 글에서 더 큰 폴더는 재지 않았다. 마운트된 폴더라 파일 접근 속도가 일반 디스크와 다를 수 있다.

파일 이름 검색은 반대였다. 같은 폴더에서 find /data -name "*atomic*"가 0.005초, fdfind atomic이 0.009초였다. 작은 폴더에서는 find가 더 빨랐고, fd의 장점은 속도보다 문법과 기본 필터에 있다.

직접 써 본 짧은 예시

같은 우분투 24.04 컨테이너에서 /w/src/a/main.cpp, /w/src/b/util.cpp, /w/README.md를 만들고 실행한 결과다.

명령결과
ls -R /w/src | fzf --filter=utilutil.cpp (대화형 선택 없이 필터만 적용)
echo '{"robots":[{"id":"r1","battery":23},{"id":"r2","battery":81}]}' | jq -r '.robots[] | select(.battery<30) | .id'r1 (배터리 30% 미만인 로봇의 id)
tmux new-session -d -s work "sleep 300" 후 tmux lswork 세션이 남아 있음
rg -n hello /w --no-heading/w/src/b/util.cpp:1:hello b, /w/src/a/main.cpp:1:hello a
fdfind -e cpp . /w/w/src/a/main.cpp, /w/src/b/util.cpp
eza --tree /w/src트리 모양(├──, └──)으로 출력
tree /w/src같은 구조를 ASCII(`
batcat --plain --color=never README.mdreadme (장식 없이 내용만)

jq로 JSON을 걸러 내는 예는 로봇 상태 응답을 터미널에서 빠르게 훑을 때 쓸 수 있다. fzf --filter는 파이프에서 이름 목록을 줄일 때 편하고, 대화형으로 고르는 기능은 이 확인에서 시험하지 않았다.

입문용 최소 조합

처음이라면 다 설치하지 말고 이 다섯 개부터 쓰길 권한다.

  1. tmux: SSH 작업의 필수품
  2. ripgrep: 코드 검색
  3. fzf: 이력·파일 선택
  4. jq: JSON 확인
  5. bat: 파일 내용 미리 보기

터미널 자체를 바꾸고 싶다면 우분투 kitty 터미널 설정도 참고할 수 있다.

확인하지 못한 것

  • 맥에서 실제 설치 후의 명령 이름과 동작
  • fzf의 셸 키 바인딩(Ctrl+R 등) 설정 방법
  • tmux 설정 파일과 플러그인