Comment trouver tous les fichiers contenant un texte spécifique sous Linux ?

J&#8217essaie de trouver un moyen de rechercher sur l&#8217ensemble de mon système Linux tous les fichiers contenant une chaîne de texte spécifique. Pour clarifier, je cherche du texte dans le fichier, pas dans le nom du fichier.

Lorsque j'ai cherché comment faire, je suis tombé deux fois sur cette solution :

find / -type f -exec grep -H 'text-to-find-here' {} \;

Cependant, cela ne fonctionne pas. Elle semble afficher tous les fichiers du système.

Est-ce la bonne façon de procéder ? Si non, comment dois-je faire ? Cette capacité à trouver des chaînes de texte dans les fichiers serait extraordinairement utile pour certains projets de programmation que je réalise.

Solution

Faites ce qui suit :

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r ou -R est récursif,
  • -n est le numéro de ligne, et
  • -w signifie correspondre au mot entier.
  • -l (L minuscule) peut être ajouté pour donner simplement le nom des fichiers correspondants.

En plus de cela, les drapeaux --exclude, --include, --exclude-dir peuvent être utilisés pour une recherche efficace :

  • Cette recherche ne portera que sur les fichiers qui ont une extension .c ou .h :

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
  • Cette méthode exclut la recherche de tous les fichiers dont l'extension est .o :

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e 'pattern' (motif)
  • Pour les répertoires, il est possible d'exclure un ou plusieurs répertoires particuliers grâce au paramètre --exclude-dir. Par exemple, ceci exclura les répertoires dir1/, dir2/ et tous ceux qui correspondent à *.dst/ :

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"

Cela fonctionne très bien pour moi, pour atteindre presque le même objectif que le vôtre.

Pour plus d'options, consultez man grep.

Commentaires (36)

Vous pouvez utiliser grep -ilR :

grep -Ril "text-to-find-here" /
  • i signifie ignorer la casse (facultatif dans votre cas).
  • R signifie récursif.
  • l signifie "afficher le nom du fichier, pas le résultat lui-même".
  • / signifie commencer à la racine de votre machine.
Commentaires (29)

Vous pouvez utiliser [ack][1]. C'est comme [grep][2] pour le code source. Il vous permet d'analyser l'ensemble de votre système de fichiers.

Il suffit de le faire :

ack 'text-to-find-here'

Dans votre répertoire racine.

Vous pouvez également utiliser des [expressions régulières][3], spécifier le type de fichier, etc.


MISE À JOUR

Je viens de découvrir [The Silver Searcher][4], qui est comme ack mais 3-5x plus rapide que lui et ignore même les motifs d'un fichier .gitignore.

[1] : http://beyondgrep.com/ [2] : http://en.wikipedia.org/wiki/Grep [3] : http://en.wikipedia.org/wiki/Regular_expression [4] : https://github.com/ggreer/the_silver_searcher

Commentaires (3)