Comment puis-je utiliser grep pour rechercher dans le répertoire courant tous les fichiers ayant la chaîne «hello» tout en affichant uniquement les fichiers .h et .cc?

139

Comment utiliser grep pour rechercher dans le répertoire courant tous les fichiers contenant la chaîne "bonjour" et afficher uniquement les fichiers .h et .cc?

stackoverflow
la source

Réponses:

161
grep -r --include=*.{cc,h} "hello" .

Cela lit: recherche récursive (dans tous les sous-répertoires également) pour tous les fichiers .cc OU .h qui contiennent "bonjour" dans ce .répertoire (actuel)

À partir d'une autre question de stackoverflow

stackoverflow
la source
5
Dans le message original, vous avez dit "répertoire courant" et rien sur le fait d'en avoir besoin de manière récursive ou dans des sous-répertoires (je me rends compte que vous l'avez mentionné dans un article ultérieur). Pour ceux qui s'intéressent à la façon de le faire uniquement dans le répertoire actuel, c'est grep -si "hello" --include=*.{cc,h} ./* ./.*(recherche également les fichiers cachés). Voici une version générique pour rechercher une chaîne dans tous les fichiers / cachés: grep -s "hello" * .*. Peut-être le plus généralement utile (et le plus simple), cela recherche tous les fichiers non cachés pour "bonjour": grep -si "hello" ./* Merci à ce post: askubuntu.com/a/777456
jbobbins
1
grep -r --include=*.{java,py} "hello" .
Pour une raison quelconque, cela ne fonctionne pas sur macOS, même lors de l'utilisation de l'utilitaire GNU grep.
xApple
49

Vous pouvez passer des caractères génériques au lieu de spécifier des noms de fichiers ou d'utiliser stdin.

grep hello *.h *.cc
Donald Miner
la source
J'ai besoin de tous les sous-répertoires également
stackoverflow
L'ajout -Rne fonctionne malheureusement pas. Il étend le *avant d'aller récursivement.
Donald Miner
La réponse de Noufal est ce que vous recherchez si vous avez besoin de sous
Donald Miner
8
@Jammin Vous devriez être clair à ce sujet lorsque vous posez la question. Cette réponse est la réponse «correcte» à votre question posée.
jordanm
$ grep -R hello *# find from all the word
19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Consultez les pages de manuel pour findet xargspour plus de détails.

Noufal Ibrahim
la source
1
Vous devez avoir un -print0après le '*.cc', sinon vous n'avez pas d'action pour cette partie de la recherche. Ou vous devez insérer entre parenthèses là: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler
Merci d'avoir remarqué cela. J'ai modifié la réponse pour la "corriger".
Noufal Ibrahim
3
Vous pouvez également utiliser la find -exec +syntaxe au lieu de xargs
jordanm
@jordanm: Oui: -exec grep "hello" {} +où la paire d'accolades représente le (s) nom (s) de fichier. Bonne suggestion.
Jonathan Leffler
10

Pour rechercher récursivement dans le répertoire courant:

grep -r 'myString' .
AB Abhi
la source
5

Si vous avez besoin d'une recherche récursive, plusieurs options s'offrent à vous. Vous devriez envisager ack.

A défaut, si vous avez GNU findet xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

L'utilisation de /dev/nullgarantit que vous obtenez les noms de fichiers imprimés; les -print0et -0traite les noms de fichiers contenant des espaces (sauts de ligne, etc.).

Si vous n'avez pas de noms difficiles (avec des espaces, etc.), vous pouvez utiliser:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Cela peut prendre quelques noms que vous n'aviez pas l'intention, car la correspondance de modèle est plus floue (mais plus simple), mais fonctionne autrement. Et cela fonctionne avec les versions non-GNU de findet xargs.

Jonathan Leffler
la source
notez que vous pouvez aussi direfind ... -exec grep "hello" {} +
fedorqui 'Alors arrêtez de nuire'
5

Si je lis attentivement votre question, vous demandez à "grep de rechercher dans le répertoire courant tous les fichiers contenant la chaîne" hello "et d'afficher uniquement les fichiers .h et .cc". Donc, pour répondre à vos besoins précis, voici ma soumission:

Cela affiche les noms de fichiers:

grep -lR hello * | egrep '(cc|h)$'

... et cela affiche les noms et le contenu des fichiers:

grep hello `grep -lR hello * | egrep '(cc|h)$'`
Jack
la source
2
grep -l hello **/*.{h,cc}

Vous souhaiterez peut-être shopt -s nullglobéviter les messages d'erreur s'il n'y a pas de fichiers .h ou pas .cc.

Glenn Jackman
la source
4
Je sais utiliser google, etc. Je l'ai posé ici car plusieurs réponses ont "-l" et c'est bien d'avoir toutes les informations en un seul endroit.
Andrew Swift
-l ("el" minuscule) Supprime la sortie normale. Imprime le nom de chaque fichier d'entrée à partir duquel la sortie aurait normalement été imprimée. La numérisation / recherche s'arrêtera à la première correspondance.
Rex CoolCode Charles
-1

Le moyen le plus simple: grep -Ril "Votre texte" /

user1733951
la source
1
Cela n'affiche pas uniquement les fichiers .h ou .cc et il est utile d'expliquer quelles options vous avez utilisées et pourquoi.
kon psych