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?

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


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

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.


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' .

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.


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)$'`

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.


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" /


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.