J’essaie de trouver un moyen de rechercher sur l’ensemble 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.
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
.
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.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