fzf: cómo usar el buscador difuso que cambia el trabajo en la terminal

Terminal con una lista de rutas filtrada por un buscador interactivo

fzf es un buscador difuso de línea de comandos, libre y con licencia MIT, que convierte cualquier lista de texto en un menú que se filtra a medida que se escribe. Con más de 82.000 estrellas en GitHub, es una de las utilidades de terminal más extendidas, y su uso más inmediato no exige aprender nada nuevo: tres atajos de teclado para buscar en el historial, insertar rutas de archivo y cambiar de directorio.

Las claves de fzf en 20 segundos

  • fzf lee una lista por la entrada estándar y devuelve la línea elegida por la salida.
  • Ctrl+R busca en el historial, Ctrl+T inserta rutas y Alt+C cambia de directorio.
  • Se instala con brew, apt, dnf, pacman, winget o el instalador del proyecto.
  • Es software libre con licencia MIT escrito en Go.

El problema que resuelve es cotidiano. Un comando que se escribió hace semanas sigue en el historial, pero encontrarlo obliga a encadenar history | grep con filtros cada vez más finos. Lo mismo pasa al buscar un archivo del que solo se recuerda parte del nombre. En ambos casos se tiene una lista y una idea aproximada de lo que se busca, y fzf permite escribir dentro de esa lista y ver cómo se reduce en tiempo real.

Ya lo incluímos en nuestra selección de 12 herramientas modernas para la terminal de Linux, pero merece una guía propia porque su valor crece cuanto más se combina con otros comandos.

Cómo funciona y cómo se busca

fzf es un filtro Unix: recibe líneas por la entrada estándar, muestra una caja de búsqueda y escribe en la salida estándar la línea seleccionada. No le importa si son archivos, ramas de git, procesos o contenedores, y por eso encaja con casi cualquier comando. La forma básica es comando_que_genera_una_lista | fzf.

La coincidencia difusa significa que los caracteres escritos deben aparecer en orden, aunque no juntos. En una lista con src/handlers/user.go, src/models/user.go y test/user_test.go, escribir shu deja solo la primera ruta, porque es la única con una s, luego una h y luego una u. El modo --filter permite probarlo sin interfaz:

printf "src/handlers/user.gonsrc/models/user.gontest/user_test.gon" | fzf --filter="shu"Lenguaje del código: JavaScript (javascript)

Cuando la búsqueda difusa devuelve demasiado, fzf ofrece operadores sin necesidad de expresiones regulares. Los términos se separan con espacios y se combinan:

  • sbtrkt: coincidencia difusa.
  • 'palabra: coincidencia exacta; 'palabra', exacta en límite de palabra.
  • ^prefijo: empieza por.
  • sufijo$: termina en.
  • !palabra: no contiene; también !^prefijo y !sufijo$.
  • a | b: una u otra.

Por ejemplo, .go !test devuelve los archivos Go que no contienen test en el nombre.

Instalación y los tres atajos imprescindibles

fzf está en los repositorios de casi todas las distribuciones (apt, dnf, pacman, apk), en Homebrew para macOS y en Chocolatey, Scoop, Winget o MSYS2 para Windows. Las versiones empaquetadas por algunas distribuciones pueden ir bastante por detrás de la última publicada, y varias funciones cambian entre versiones. Si se quiere la más reciente, el proyecto ofrece binarios en GitHub y un instalador:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/installLenguaje del código: JavaScript (javascript)

Lo más importante es activar la integración con la shell. En versiones recientes basta con añadir una línea al archivo de configuración:

# ~/.bashrc
eval "$(fzf --bash)"

# ~/.zshrc
source <(fzf --zsh)

# ~/.config/fish/config.fish
fzf --fish | sourceLenguaje del código: PHP (php)

Con eso llegan tres atajos. Ctrl+R sustituye la búsqueda inversa del historial por una lista filtrable: se escribe ffmpeg scale y aparecen todos los comandos que coinciden. Ctrl+T inserta en la posición del cursor la ruta de un archivo o directorio elegido, útil a mitad de un comando como vim. Alt+C entra en un subdirectorio elegido con la misma búsqueda.

La integración también añade autocompletado difuso con ** seguido de Tab: vim **<Tab> para archivos, kill -9 **<Tab> para procesos o ssh **<Tab> para hosts. En fish se usa Mays+Tab.

Vista previa y combinaciones útiles

La opción --preview ejecuta un comando sobre la línea resaltada y muestra el resultado al lado, con {} como marcador del elemento actual. Con bat se obtiene resaltado de sintaxis, y fzf admite también vistas previas de imágenes en terminales compatibles con Kitty, iTerm2 o Sixel.

fzf --preview 'bat --color=always {}'Lenguaje del código: JavaScript (javascript)

El patrón para el resto de usos es siempre el mismo: generar una lista, pasarla a fzf y actuar sobre la elección. Algunos ejemplos:

# Cambiar de rama de git
git branch | fzf | xargs git checkout

# Terminar un proceso
ps aux | fzf | awk '{print $2}' | xargs kill

# Entrar en un contenedor de Docker
docker ps --format '{{.Names}}' | fzf | xargs -I {} docker exec -it {} sh

# Buscar en variables de entorno
env | fzfLenguaje del código: PHP (php)

Conviene usar estos atajos con cuidado en servidores de producción: un kill o un checkout sobre la línea equivocada no se deshace. La opción -m permite seleccionar varias líneas con Tab, así que merece la pena revisar la selección antes de pulsar Intro.

Las opciones por defecto se fijan con variables de entorno. FZF_DEFAULT_OPTS define el aspecto, por ejemplo --height 40% --layout reverse --border para una ventana compacta bajo el prompt, y FZF_DEFAULT_COMMAND elige qué genera la lista de archivos. Usar fd --type f --hidden --exclude .git la hace más rápida y respeta el .gitignore. Cada atajo tiene además sus propias variables, como FZF_CTRL_T_OPTS, FZF_CTRL_R_OPTS o FZF_ALT_C_COMMAND.

fzf no sustituye a grep o rg en scripts desatendidos ni en búsquedas exactas bien definidas: es una herramienta interactiva para cuando se sabe aproximadamente lo que se quiere. Quien use Vim tiene además el complemento fzf.vim, y en tmux 3.3 o posterior la opción --popup abre fzf en una ventana emergente. Para quien quiera seguir personalizando la terminal, en este medio también hemos repasado ocho plugins de Zsh poco conocidos.

Preguntas frecuentes

¿Qué es fzf?

Un buscador difuso de línea de comandos que filtra de forma interactiva cualquier lista de texto y devuelve la línea elegida.

¿Cómo se activan Ctrl+R y Ctrl+T con fzf?

Añadiendo eval "$(fzf --bash)" a ~/.bashrc, source <(fzf --zsh) a ~/.zshrc o fzf --fish | source en fish.

¿Por qué no funciona fzf –bash en mi distribución?

Probablemente porque el paquete de la distribución es antiguo. Esas opciones requieren versiones recientes; el instalador del proyecto o sus binarios dan la última.

¿Qué licencia tiene?

Licencia MIT.

Fuentes:

Suscríbete al boletín SysAdmin

Este es tu recurso para las últimas noticias y consejos sobre administración de sistemas, Linux, Windows, cloud computing, seguridad de la nube, etc. Lo enviamos 2 días a la semana. Recuerda revisar tu email para confirmar la suscripción.

Scroll al inicio
×