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-RandALT-Cadd 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
TABfor 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)
sudoprivilegescurlinstalled (sudo apt install curlif 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:
- Create the keyrings directory - ensures
/etc/apt/keyringsexists with the right permissions. - Install the GPG key - downloads the key and de-armours it into a dedicated keyring for signature verification.
- Add the repository - writes a
signed-bysource line, usinglsb_release -scto detect your Debian codename. - 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
cdinto 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
cdthat integrates neatly with fzf for interactive jumps. - eza - a modern
lsreplacement 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:
- Re-run
sudo apt updateafter adding the repository. - Confirm your release is supported (Bookworm, Trixie, or Sid).
- 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.