Grep, rechercher de manière récursive un terme (ou plusieurs) dans tous les fichiers d’un répertoire

Récemment en croisant un article je me suis dit qu’il fallait que je « fixe » mon idée sur la commande grep que j’utilise. Cette commande est indispensable pour moi et me sert à rechercher de manière récursive un terme (ou plusieurs) dans tous les fichiers d’un répertoire.

Je vais reprendre cet article pour la comparaison et parce qu’un truc me gêne aussi, c’est de balancer des options sans expliquer à quoi cela correspond.

bash_completion est le MOTIF recherché et /usr l’endroit où on le recherche (ici dans le dossier /usr). C’est un exemple simple pour voir les différences entre les deux propositions, je vous invite à faire les tests ci-dessous.

grep --color=auto -iRnH 'bash_completion' /usr # Proposition chez sois-net.fr

-i : Ignorer la casse aussi bien dans le MOTIF (dans notre exemple c’est bash_completion) que dans les fichiers
-R : Lire récursivement tous les fichiers à l’intérieur de chaque répertoire. Suivre tous les liens symboliques, contrairement à -r
-n : Préfixer chaque ligne de sortie par le numéro de la ligne dans le fichier. La numérotation commence à la ligne 1
-H : Afficher le nom du fichier pour chaque correspondance. C’est le comportement par défaut quand la recherche est effectuée sur plusieurs fichiers (on peut donc s’en passer car c’est le comportement par défaut et qu’on utilise l’option -R…)

grep --color=auto -RInis 'bash_completion' /usr # Ma proposition

-R : Lire récursivement tous les fichiers à l’intérieur de chaque répertoire. Suivre tous les liens symboliques, contrairement à -r
-I : Traiter un fichier binaire comme s’il ne contenait aucune correspondance (très utile mais là c’est un choix donc à vous de voir, je ne cherche jamais un MOTIF dans un fichier binaire. Avec cette option grep n’ira pas chercher notre MOTIF dans des fichiers binaires comme /usr/bin/ssh ou /usr/bin/top. J’ajoute qu’un fichier binaire est un fichier qui n’est pas un fichier texte par définition)
-n : Préfixer chaque ligne de sortie par le numéro de la ligne dans le fichier. La numérotation commence à la ligne 1
-i : Ignorer la casse aussi bien dans le MOTIF que dans les fichiers
-s : Ne pas afficher les messages d’erreur concernant les fichiers inexistants ou illisibles (très utile ça évite des messages comme grep: /usr/lib/firefox/hyphenation: Aucun fichier ou dossier de ce type ou encore quand on n’est pas root des messages comme grep: /usr/lib/ssl/private: Permission non accordée)

Le cas --color=auto ou --color=always

Avec --color=always si on chaîne la sortie vers une commande (via un pipe |) ou si on redirige la sortie vers un fichier (via > ou >>) alors les caractères liés aux couleurs ne seront pas bien interprétés.

Avec --color=auto, les couleurs sont affichées sur la sortie sauf si on chaîne la sortie vers une commande ou si on redirige la sortie vers un fichier, on évite ainsi les caractères liés aux couleurs mal interprétés.

A noter que la plupart des utilisateurs voudront utiliser less ET avoir la couleur, on procèdera donc ainsi : grep --color=always -RInis 'bash_completion' /usr | less -R

Tcho les filles !


Il semblerait que j’ai trouvé ça sur commandlinefu mais je m’en souvenais pas.

Spéciale dédicace à Seboss666 : Oui je suis bavard et je fais des articles complets !! Et tu n’as pas intérêt à t’en plaindre ;)

Déjà 4 avis pertinents dans Grep, rechercher de manière récursive un terme (ou plusieurs) dans tous les fichiers d’un répertoire

Les commentaires sont fermés.