Aller au contenu principal

ripgrep — l'outil de recherche qui a changé mon workflow WSL2

Découvrez ripgrep, l'alternative ultra-rapide à grep écrite en Rust. Installation sur Ubuntu/WSL2, configuration ZSH, fonctions shell pratiques et cas d'usage réels qui vont transformer votre façon de chercher dans le code au quotidien.

· 14 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Claude Code
Assistant IA
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Journal des modifications

Dernière
The rc setup and the rgtodo/rgenv functions now come in a zsh and a bash version, in ~/.zsh/fns or ~/.bash/fns.
added a Docker-first demo to try before installing

ripgrep — l'outil de recherche qui a changé mon workflow WSL2

⚡
TL;DR

ripgrep (rg) est un outil de recherche ligne par ligne écrit en Rust qui surpasse largement le grep traditionnel — surtout sur les gros codebases. Il respecte .gitignore par défaut, ignore les fichiers binaires et gère l'Unicode nativement. Cet article couvre l'installation sur Ubuntu/WSL2, un fichier de configuration ~/.ripgreprc, des alias et fonctions ZSH pour votre ~/.zshrc et votre répertoire ~/.zsh/fns/, ainsi que des cas d'usage réels qui vous feront vous demander comment vous avez fait sans lui jusqu'ici.

Zut. J'ai tapé cette commande tellement de fois que je pourrais la taper les yeux fermés : grep -rn --include="*.php" "getUser" . | grep -v vendor. Ça marche — grep est un classique, il fait le job. Mais au fil des années, j'ai accumulé tellement de flags, tellement d'alias, tellement de contournements devenus automatiques pour les bizarreries de grep... À un moment, il faut se poser la question : est-ce qu'il existe mieux ?

Que fait réellement cette commande ?

grep -rn --include="*.php" "getUser" . se décompose comme suit : -r cherche récursivement dans tous les sous-répertoires, -n affiche le numéro de ligne de chaque correspondance, --include="*.php" limite la recherche aux seuls fichiers .php, "getUser" est le motif recherché et . indique de partir du répertoire courant. Le | grep -v vendor final envoie les résultats dans un second grep qui filtre et EXCLUT (-v) toute ligne contenant vendor — un contournement courant pour exclure le dossier de dépendances vendor/, que grep n'a aucun moyen natif d'ignorer.

Oui, il existe mieux. Ça s'appelle ripgrep, et une fois qu'on y a goûté, impossible de revenir en arrière.

Il appartient à la même famille de réécritures modernes que eza (pour ls) et delta (pour git diff).

ripgrep vs grep — comparaison côte à côte​

Laissez-moi vous montrer pourquoi ripgrep s'impose aussi vite. Voici les mêmes recherches exprimées dans les deux outils :

Avec grep :

grep -rn --include="*.php" "getUser" . \
| grep -v vendor

Avec ripgrep :

rg "getUser" --type php

Avec grep :

grep -rn -i "TODO" . \
--include="*.py" \
--include="*.pyi" \
--exclude-dir=.venv \
--exclude-dir=dist

Avec ripgrep :

rg -i "TODO" --type py

Avec grep :

grep -rn "DB_PASSWORD" . \
--include="*.env" \
--include="*.yml" \
--include="*.yaml"

Avec ripgrep :

rg "DB_PASSWORD" -t yaml -t sh

Bien sûr, les flags de grep sont puissants une fois qu'on les connaît par cœur. Mais la syntaxe de ripgrep est tout simplement plus propre — et par défaut, il ignore déjà vendor/, node_modules/ et tout ce qui se trouve dans votre .gitignore, sans le moindre flag supplémentaire.

Qu'est-ce que ripgrep ?​

ripgrep (rg en ligne de commande) est un outil de recherche ligne par ligne écrit en Rust par Andrew Gallant (BurntSushi). La vitesse est son argument phare — les benchmarks montrent systématiquement qu'il devance grep, ag (le Silver Searcher) et ack de loin sur les gros codebases — et hyperfine vous permet de vérifier cette affirmation sur votre propre machine. Mais la vitesse brute n'est qu'une partie de l'histoire.

Ce qui rend ripgrep réellement meilleur au quotidien, ce sont ses valeurs par défaut intelligentes :

  • Il respecte automatiquement les fichiers .gitignore, .ignore et .rgignore — donc vendor/, node_modules/, dist/ et .git/ sont ignorés sans aucune gymnastique à base de --exclude-dir.
  • Il ignore les fichiers binaires par défaut.
  • Il colorise et regroupe la sortie par nom de fichier d'office.
  • Il utilise l'Unicode par défaut — fini la sortie illisible sur les noms de fichiers ou les contenus accentués.
  • Il supporte la syntaxe regex moderne, y compris PCRE2 avec le flag -P.
  • Il ne cherche dans les fichiers cachés que si vous le demandez explicitement (--hidden).

Ce dernier comportement d'affichage est sous-estimé. Des résultats lisibles, groupés, colorisés — immédiatement, sans la moindre configuration. Plutôt sympa, non ?

Le voir à l'œuvre avec Docker​

Avant de toucher à votre propre ~/.zshrc, essayez ripgrep dans un container jetable qui embarque déjà la config ~/.ripgreprc, les fonctions rgtodo/rgenv et un petit faux projet conçu pour mettre en valeur les valeurs par défaut intelligentes : un dossier vendor/ qui doit rester invisible, des commentaires TODO/FIXME, un DB_PASSWORD qui fuit et un appel console.log(token) qui mérite d'être signalé.

Pourquoi commencer par Docker ?

Le Dockerfile ci-dessous reproduit exactement le .ripgreprc, les fonctions .zsh/fns/ et la section .zshrc de cet article, puis construit le projet de démonstration. Rien ne change sur votre propre machine.

Buildez et lancez :

>user@machine: ~/ripgrep-demo

$ docker build -t ripgrep-demo . [+] Building 21.3s (10/10) FINISHED ✔ exporting to image

$ docker run --rm -it ripgrep-demo 🐳 root ~/demo #

Jouez maintenant avec les scénarios décrits plus haut, en direct :

>user@machine: ~/yourproject

Remarquez que vendor/legacy/User.php — qui définit lui aussi getUser, exprès — n'apparaît jamais dans aucune de ces recherches : le .gitignore et l'entrée de configuration --glob=!vendor/* l'excluent tous les deux, exactement comme décrit plus haut. Essayez rg --no-ignore "getUser" pour le voir réapparaître.

Installation sur Ubuntu / WSL2​

ripgrep est présent dans les dépôts de paquets par défaut d'Ubuntu, donc l'installer tient en une ligne :

Prérequis : ripgrep

>user@machine: ~/yourproject

Vérifier :

>user@machine: ~/yourproject

Vous voulez la dernière version ?

Les dépôts Ubuntu ont parfois quelques releases de retard sur ripgrep en amont. Pour la version la plus récente, récupérez le dernier package .deb directement depuis la page des releases GitHub et installez-le avec sudo dpkg -i ripgrep_*.deb. À partir de la version 14, vous bénéficiez aussi d'un meilleur support de PCRE2 et d'un parcours de répertoires plus rapide.

Configuration — ~/.ripgreprc​

Comme la plupart des outils Unix, ripgrep se configure via un fichier dédié. Vous le désignez avec la variable d'environnement RIPGREP_CONFIG_PATH. Voici un exemple de fichier ~/.ripgreprc :

--colors=match:fg:red
--colors=match:style:bold
--colors=path:fg:blue
--follow
--glob=!.cache/*
--glob=!.git/*
--glob=!.output/*
--glob=!.yarn/*
--glob=!build/*
--glob=!dist/*
--glob=!node_modules/*
--glob=!vendor/*
--hidden
--max-filesize=10M
--smart-case

Cette configuration définit des options de recherche pour un outil de type grep ou ripgrep. Elle colore les correspondances en rouge et gras, affiche les chemins en bleu, suit les liens symboliques, exclut les répertoires courants de cache et de dépendances, inclut les fichiers cachés, limite la taille des fichiers et active la sensibilité intelligente à la casse.

Chaque ligne est un flag appliqué par défaut à chaque invocation de rg. Quelques points méritent une explication :

  • --hidden fait chercher ripgrep à l'intérieur des fichiers et dossiers cachés (tout ce qui commence par un point). Combiné à l'exclusion --glob=!.git/*, cela veut dire que vous pouvez chercher dans les fichiers .env, .zshrc, .gitignore et consorts sans ouvrir toute la plomberie interne de .git/.
  • --max-filesize=10M ignore silencieusement les très gros fichiers (dumps de logs, assets générés) qui noieraient sinon vos résultats.
  • --smart-case est probablement le réglage le plus impactant : les recherches sont insensibles à la casse par défaut, mais dès que votre motif contient une majuscule, ripgrep bascule en correspondance exacte de casse — exactement le comportement que je veux 95 % du temps.

Configuration du shell — ~/.zshrc ou ~/.bashrc​

Une fois le fichier de config en place, j'ajoute la variable d'environnement, le chargeur de fonctions et une poignée d'alias par type de fichier dans le fichier rc de mon shell. Le contenu est identique pour zsh et bash, sauf la boucle de chargement :

export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"
# If you don't already have such loop...
# Load custom ZSH functions from ~/.zsh/fns/
for fn_file in ~/.zsh/fns/*.zsh; do
source "${fn_file}"
done
# Type-specific shortcuts
alias rgp='rg --type php'
alias rgj='rg --type js'
alias rgt='rg --type ts'
alias rgm='rg --type md'
alias rgy='rg --type yaml'
alias rgb='rg --type sh'
alias rgd='rg --glob "Dockerfile*" --glob "*.dockerfile"'

Ce script configure l'environnement ZSH en établissant le chemin de configuration pour ripgrep, en chargeant des fonctions personnalisées depuis un répertoire, et en créant des raccourcis (alias) pour des recherches ripgrep spécifiques à différents types de fichiers. C'est une initialisation de shell qui améliore la productivité en préconfigurant des commandes courantes.

La boucle for fn_file source automatiquement chaque fichier de fonction présent dans ce répertoire — ajouter une nouvelle fonction revient donc simplement à y déposer un nouveau fichier, sans avoir à retoucher votre fichier rc.

Les alias par type (rgp pour PHP, rgt pour TypeScript, rgm pour Markdown, etc.) font gagner des frappes quand vous savez exactement dans quel type de fichier vous cherchez. J'utilise rgp "getUser" ou rgm "## Installation" des dizaines de fois par jour.

Fonctions shell — ~/.zsh/fns/ ou ~/.bash/fns/​

C'est ici que ça devient amusant. Voici trois fonctions que j'ai installées dans mon répertoire ~/.zsh/fns/, chacune résolvant un vrai problème.

rgf — recherche interactive avec fzf​

J'ai détaillé cette combinaison dans un article dédié : FZF + ripgrep : recherche de code interactive avec aperçu en direct. En résumé : envoyez rg dans fzf avec un panneau de prévisualisation bat et vous obtenez un chercheur flou interactif qui cherche dans le contenu des fichiers, prévisualise les correspondances avec coloration syntaxique et ouvre votre éditeur exactement à la ligne trouvée. Si vous n'avez pas encore lu cet article, le détour en vaut la peine.

rgtodo — faire remonter toute la dette technique d'un coup​

Chaque codebase en est truffé dans ses commentaires : TODO, FIXME, HACK, NOTE, XXX. Cette fonction les fait tous remonter à la surface :

Lancez rgtodo à la racine de n'importe quel projet et vous obtenez une liste triée et colorisée de chaque marqueur de commentaire. Lancez rgtodo src/ pour la restreindre à un dossier précis. Révélateur sur des codebases qui ont quelques années au compteur.

>user@machine: ~/yourproject

rgenv — traquer l'usage des variables d'environnement​

Dans les projets très orientés Docker, les variables d'environnement finissent éparpillées entre des fichiers .env, compose.yml, des bootstraps PHP et des configs Python. Cette fonction cherche dans tous ces fichiers d'un seul coup :

rgenv DB_PASSWORD montre instantanément chaque fichier qui référence cette variable — qu'il la définisse, la consomme ou la passe comme secret Docker. Inestimable pour déboguer les dérives de configuration dans les setups multi-containers complexes.

>user@machine: ~/yourproject

Installer rgtodo et rgenv​

Les deux fonctions sont du code shell pur : les mêmes fichiers fonctionnent en zsh et en bash, seul le dossier change. La boucle de chargement est déjà dans votre fichier rc depuis la section précédente.

1. Créez les fichiers dans ~/.zsh/fns/ :

📦 Mise en place du projet : ~/.zsh/fns
Aide

Besoin d'aide ? Cliquez sur le bouton « Aide » ci-dessus pour les instructions de mise en place.

2. Ouvrez un nouveau terminal (ou lancez exec zsh).

Vérifiez que le shell les connaît : type rgtodo rgenv doit répondre deux fois … is a shell function.

Cas d'usage réels​

Passons en revue les recherches que je lance le plus souvent dans mon workflow WSL2 quotidien.

Trouver la définition d'une fonction dans un projet PHP​

rg "function getUser" --type php

Sans ripgrep : il faut ajouter --include="*.php", --exclude-dir=vendor, -rn. Avec ripgrep : tapez-le, point. Le répertoire vendor/ est déjà exclu parce qu'il est dans le .gitignore.

Chercher une référence d'image dans tous les fichiers Docker Compose​

rgy "image:"

C'est notre alias rgy (rg --type yaml). Pratique pour auditer un repository à la recherche de références d'images obsolètes, ou pour trouver tous les services qui partagent une image de base.

Lignes de contexte — comprendre le code autour d'une correspondance​

Le flag -C N affiche N lignes de contexte autour de chaque correspondance — une fonctionnalité que j'utilise en permanence :

>user@machine: ~/yourproject

Vous pouvez aussi utiliser -A N (après) et -B N (avant) séparément, exactement comme avec grep.

Un scénario plus courant : un collègue laisse des appels console.log() dans du JavaScript avant de pousser en production. Sans contexte, vous ne voyez que la ligne elle-même — vous savez qu'elle existe, mais pas à quel point c'est grave. Avec -C 2 :

>user@machine: ~/yourproject

Là, vous pouvez faire la différence. La première correspondance logue un token JWT en clair — c'est un problème de sécurité, pas juste du bruit. La seconde se trouve dans une boucle for sur un panier : un seul passage en caisse inonderait la console de centaines de lignes. Le contexte transforme une liste de correspondances en information exploitable.

Compter les occurrences par fichier​

rg -c "console.log" --type js

Ceci affiche le nombre de correspondances par fichier — parfait pour identifier quels fichiers sources contiennent encore des instructions de debug avant une release.

Renommage en masse avec rg + sed​

ripgrep est volontairement en lecture seule (pas de mode -i d'édition sur place), mais il se marie très bien avec sed pour du refactoring en masse :

>user@machine: ~/yourproject

rg -l ne liste que les noms de fichiers qui contiennent des correspondances. L'envoyer dans xargs sed -i réécrit exactement ces fichiers — ni plus, ni moins. Bien plus sûr qu'un find | xargs sed brut qui n'a aucune idée des fichiers réellement concernés.

Chercher dans plusieurs types de fichiers à la fois​

rg "API_KEY" -t php -t yaml -t sh

Plusieurs flags -t se combinent — ripgrep cherche dans tous les types correspondants en une seule passe, avec une sortie colorisée unifiée.

Limiter la profondeur de recherche​

rg "FROM" --glob "Dockerfile*" --max-depth 3

--max-depth est idéal quand vous voulez rester près du répertoire courant sans plonger dans chaque sous-répertoire imbriqué.

À retenir​

ripgrep : aide-mémoire

  • Installer — sudo apt install ripgrep sur Ubuntu/WSL2
  • Configurer — créez ~/.ripgreprc et pointez dessus via RIPGREP_CONFIG_PATH dans ~/.zshrc
  • Flags de type — -t php au lieu de --include="*.php" — plus court et plus malin
  • Smart case — --smart-case vous donne des recherches insensibles à la casse qui basculent en exact dès que vous utilisez une majuscule
  • Conscient du gitignore — vendor/, node_modules/, .git/ sont exclus automatiquement ; aucun flag nécessaire
  • Lignes de contexte — -C 3 affiche 3 lignes au-dessus et en dessous de chaque correspondance
  • Mode liste de fichiers — rg -l ne renvoie que les noms de fichiers ; envoyez-les dans xargs pour des opérations en masse
  • Mode interactif — rgf "pattern" combine ripgrep et fzf pour une recherche avec prévisualisation en direct ; configuration complète dans FZF + ripgrep

Conclusion​

Au début de cet article, je disais avoir tapé cette commande grep -rn --include="*.php" ... | grep -v vendor tellement de fois qu'elle était devenue un réflexe. Aujourd'hui, chaque fois que j'ouvre un terminal dans WSL2, je tape rg sans même y penser. L'exclusion de vendor/ est automatique, la sortie est lisible sans aucun flag et la recherche est réellement plus rapide sur les gros codebases. Entre la configuration ~/.ripgreprc, les alias de type dans ~/.zshrc, des fonctions comme rgtodo et rgenv dans ~/.zsh/fns/, et la recherche interactive rgf couverte dans un article dédié, ripgrep a cessé d'être un outil que je choisis consciemment pour devenir la colonne vertébrale invisible de ma façon de naviguer dans le code au quotidien. Si vous en êtes encore à grep nu dans votre environnement WSL2, accordez-vous vingt minutes avec ripgrep — c'est tout ce qu'il faut.


🦋 Rejoignez la conversation sur BlueskyUn compte Bluesky gratuit est nécessaire pour aimer, repartager ou commenter. Ce bloc interroge l'API publique de Bluesky directement depuis votre navigateur (sans cookie, sans connexion) — votre adresse IP parvient donc aux serveurs de Bluesky dès que cette section se charge.

Chargement des commentaires…

Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?