How to Install fzf on Debian: The Command-Line Fuzzy Finder

fzf is a general-purpose command-line fuzzy finder. It reads any list on standard input, files, Git branches, processes, shell history, command output, and lets you narrow it down interactively with fuzzy matching, then prints your selection to standard output. That tiny contract makes it astonishingly composable: almost any command that produces a list can be piped through fzf to become interactive.

Debian does ship an fzf package, but it can trail the upstream project, and older builds miss recent flags and the newer preview and key-binding behaviour that make fzf so pleasant to use. Since fzf evolves quickly, running a current build matters.

The unofficial deb.griffo.io repository packages an up-to-date fzf as a standard Debian .deb, installable and upgradable through APT just like the rest of your system.

What Makes fzf Special?

  • 🔍 Fuzzy matching - Type a few scattered characters and fzf ranks the best matches instantly.
  • ⚡ Blazing fast - Written in Go, it stays responsive over lists of hundreds of thousands of lines.
  • 🪟 Live preview window - Preview file contents, diffs or command output beside the result list.
  • ⌨️ Shell key-bindings - CTRL-T, CTRL-R and ALT-C add fuzzy file, history and directory jumping to your shell.
  • 🔧 Completion integration - Trigger fuzzy completion with **<TAB> in supported shells.
  • 🧩 Endlessly composable - Pipe any list in, get a selection out; it plugs into countless workflows.
  • 🎨 Fully themeable - Colours, layout, borders and the preview window are all configurable.
  • 🖱️ Multi-select - Pick many items at once with TAB for batch operations.

Why Use the deb.griffo.io Repository?

  • Easy installation and updates through APT.
  • Automatic dependency management handled by Debian packaging.
  • Always tracks upstream releases so you get current fzf features.
  • No compiling from source and no Go toolchain to manage.
  • Works across supported Debian releases, with the codename detected automatically.

Prerequisites

Before you begin, make sure you have:

  • A Debian-based system (Bookworm 12, Trixie 13, or Sid)
  • sudo privileges
  • curl installed (sudo apt install curl if needed)

Step 1: Add the deb.griffo.io Repository

Add the signing key and repository source:

# Create the keyrings directory
sudo install -d -m 0755 /etc/apt/keyrings

# Download and install the repository GPG key
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg

# Add the repository (auto-detects your distro codename)
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null

# Update the package list
sudo apt update

What each command does:

  1. Create the keyrings directory - ensures /etc/apt/keyrings exists with the right permissions.
  2. Install the GPG key - downloads the key and de-armours it into a dedicated keyring for signature verification.
  3. Add the repository - writes a signed-by source line, using lsb_release -sc to detect your Debian codename.
  4. Update the package list - refreshes APT so it sees the new packages.

Step 2: Update the Package List

If you skipped the last line, refresh the index now:

sudo apt update

Step 3: Install fzf

Install fzf with APT:

sudo apt install fzf

APT installs the fzf binary and its shell integration scripts system-wide.

Step 4: Verify the Installation

The binary is fzf. Check the version:

fzf --version

You should see output similar to:

0.54.3 (a1b2c3d)

Running fzf on its own opens an interactive finder over the files in the current directory tree.

Getting Started with fzf

Fuzzy-Finding Files and Piping Lists

At its core fzf reads a list on stdin and writes your choice to stdout:

# Interactively pick a file, then open it
vim "$(fzf)"

# Fuzzy-select from any command's output
ps aux | fzf

# Choose a Git branch and check it out
git branch | fzf | xargs git checkout

Enabling Shell Key-Bindings and Completion

The real productivity boost comes from the shell integration. On Debian the packaged scripts live under /usr/share/doc/fzf/examples. Add this to your ~/.bashrc:

# Bash key-bindings and completion
[ -f /usr/share/doc/fzf/examples/key-bindings.bash ] && source /usr/share/doc/fzf/examples/key-bindings.bash
[ -f /usr/share/bash-completion/completions/fzf ] && source /usr/share/bash-completion/completions/fzf

On recent fzf versions you can instead use the built-in generator:

# Add to ~/.bashrc (fzf 0.48+)
eval "$(fzf --bash)"

Reload your shell and you gain three key-bindings:

  • CTRL-T - paste a fuzzy-selected file or directory path onto the command line.
  • CTRL-R - fuzzy-search your command history.
  • ALT-C - fuzzy-select a subdirectory and cd into it.

Fuzzy Completion with **

With completion loaded, type a trigger sequence and press TAB to fuzzy-complete arguments:

# Fuzzy-complete a path
vim **<TAB>

# Fuzzy-complete a host for ssh
ssh **<TAB>

# Fuzzy-complete a process to kill
kill -9 **<TAB>

Preview Windows

Pair fzf with a pager or a syntax highlighter to preview as you scroll:

# Preview file contents while selecting
fzf --preview 'cat {}'

# A nicer preview with line numbers, if you have bat installed
fzf --preview 'bat --style=numbers --color=always {}'

Configuring Defaults

Set persistent options through the FZF_DEFAULT_OPTS environment variable in your shell config:

export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border --info=inline"
export FZF_DEFAULT_COMMAND='find . -type f -not -path "*/.git/*"'

Keeping fzf Updated

Because fzf came from APT, updates arrive with your regular system upgrades:

sudo apt update && sudo apt upgrade

When deb.griffo.io publishes a newer fzf, apt upgrade installs it automatically.

Other Tools from deb.griffo.io

The repository packages many tools that pair well with fzf:

  • zoxide - a smarter cd that integrates neatly with fzf for interactive jumps.
  • eza - a modern ls replacement with colours and icons.
  • Neovim - the editor whose fuzzy pickers are inspired by fzf.
  • Lazygit - a terminal UI for Git that complements fzf-driven branch selection.

Troubleshooting

GPG or Key Errors

If APT reports an unsigned repository or an invalid key, re-import it:

curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
sudo apt update

Package Not Found

If APT cannot find fzf:

  1. Re-run sudo apt update after adding the repository.
  2. Confirm your release is supported (Bookworm, Trixie, or Sid).
  3. Check the source list: cat /etc/apt/sources.list.d/deb.griffo.io.list.

Key-Bindings Not Working

If CTRL-T or CTRL-R do nothing, the integration script has not been sourced. Confirm the files exist and that your shell reads them:

ls /usr/share/doc/fzf/examples/
grep -n "fzf" ~/.bashrc

Make sure the source lines are present and open a fresh terminal so the changes take effect.

Uninstalling

Remove fzf with:

sudo apt remove fzf

To also drop the repository and key:

sudo rm /etc/apt/sources.list.d/deb.griffo.io.list
sudo rm /etc/apt/keyrings/deb.griffo.io.gpg
sudo apt update

Remember to remove any source lines you added to ~/.bashrc.

Conclusion

Installing fzf from deb.griffo.io gives Debian users a current fuzzy finder without compiling Go or fighting a stale archive build. Once the shell key-bindings and completion are enabled, CTRL-T, CTRL-R and **<TAB> quickly become reflexes you cannot work without.

fzf’s genius is its simplicity: a list in, a choice out. That one idea plugs into countless workflows, and keeping the tool current is now just another apt upgrade.

Resources


Disclaimer: The deb.griffo.io repository is an unofficial community project and is not affiliated with the official Debian or Ubuntu projects, or with the upstream fzf project.