Profile picture

[Shell Script] fzf(Fuzzy finder)

JaehyoJJAng2025년 01월 25일

fzf

fzf는 명령줄에서 빠르고 효율적으로 파일을 찾거나, 히스토리에서 명령어를 검색하거나, 프로세스를 선택하는 등

퍼지 검색 기능을 제공하는 범용적인 대화형 필터 도구입니다.


주요 특징

특징 설명
퍼지 검색 입력한 문자열이 정확히 일치하지 않더라도 유사한 패턴을 가진 결과를 찾습니다. 예를 들어, abc를 검색하면 axbyc 같은 결과도 같이 찾아줍니다!
대화형 인터페이스 fzf를 실행하면 별도의 터미널 화면이 열리고, 실시간으로 검색어를 입력하면서 결과 목록이 필터링 됩니다
확장성 사용자 정의 스크립트나 외부 명령어와 쉽게 연동하여 기능 확장이 가능합니다

fzf 작동 방식

fzf는 기본적으로 다음의 파이프라인을 통해 작동해요.

데이터 소스 | fzf [옵션] | 선택된 결과 처리
  • 데이터 소스: ls, find, history, ps 등 어떤 명령의 출력이라도 될 수 있습니다.
  • fzf: 표준 입력으로 받은 데이터를 필터링하고, 사용자에게 대화형 인터페이스를 제공하여 선택하게 합니다.
  • 선택된 결과 처리: 사용자가 Enter를 눌러 선택한 항목은 fzf의 표준 출력(stdout)으로 나옵니다. 이 출력을 다른 명령의 인수로 사용하거나 변수에 저장할 수 있어요.

설치

# Debian
sudo apt install fzf

# Arch
sudo yay -S fzf

# Rhel
sudo dnf install fzf

fzf 사용 예제

다양한 활용 예시를 통해 fzf의 기능을 살펴볼게요.


1. 기본 파일 검색

현재 디렉토리와 하위 디렉토리의 모든 파일을 검색합니다.

find . -type f | fzf

2. 디렉토리 이동

cd 명령과 함께 사용하여 디렉토리를 쉽게 이동할 수 있습니다.

fzf를 통해 디렉토리를 선택하고, 해당 디렉토리로 이동하는 함수를 ~/.bashrc 또는 ~/.zshrc에 추가하여 사용해보세요.

# ~/.bashrc 또는 ~/.zshrc 에 추가
fd() {
  local dir
  dir=$(find "${1:-.}" -type d 2> /dev/null | fzf +m)
  [ -z "$dir" ] && return
  cd "$dir"
}

위 코드를 추가한 후 터미널에 fd를 입력하면 현재 디렉토리의 하위 디렉토리를 검색하여 이동이 가능합니다.

추가로 fd ~/project와 같이 인수를 넘겨주면 해당 경로 아래에서 검색합니다.
image


fzf로 대화형 스크립트 구현하기

이번 챕터에서는 fzf를 사용하여 대화형 스크립트 예제를 몇 개 작성해볼게요.


1. 로그 파일에서 패턴 선택 후 검색

#!/usr/bin/bash

# 대규모 로그에서 흔한 패턴 추출
patterns=$(cat /var/log/pacman.log | grep -oE '\b[a-zA-Z]+\b' | sort | uniq)
pattern=$(echo "$patterns" | fzf --prompt="검색할 패턴 선택: ")

echo "선택된 패턴: $pattern"
echo "관련 로그 출력"
grep "$pattern" /var/log/pacman.log | less

image


2. 함수별 실행 메뉴 구현

#!/usr/bin/bash

add_rule() {
    echo "add_rule"
}

insert_rule() {
    echo "insert_rule"
}

main_menu() {
    options=(
        "Add Rule"
        "Insert Rule"
        "Delete Rule"
        "Set Default Policy"
        "Show Current Rules"
        "Exit"
    )
    choice=$(printf "%s\n" "${options[@]}" | fzf --prompt="옵션을 선택하세요: ")

    case "$choice" in
        "Add Rule") add_rule ;;
        "Insert Rule") insert_rule ;;
        "Exit") echo "종료할게요!"; exit 0 ;;
    esac
}

main_menu

image

    Tag -

Loading script...