web-dev-qa-db-fra.com

Comment utiliser grep pour rechercher dans le répertoire en cours tous les fichiers ayant la chaîne "hello" et n’afficher que les fichiers .h et .cc?

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

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

Cela lit: recherche récursive (dans tous les sous-répertoires également) pour tous les fichiers .cc OR .h contenant "hello" dans ce répertoire . (en cours)

d'une autre question de stackoverflow

149
stackoverflow

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
45
Donald Miner

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

Consultez les pages de manuel pour find et xargs pour plus de détails.

19
Noufal Ibrahim

Si je lis attentivement votre question, vous demandez à "grep" de rechercher dans le répertoire en cours tous les fichiers contenant la chaîne "bonjour" et n'affiche que les fichiers .h et .cc ". Donc, pour répondre à vos exigences précises, voici mon mémoire:

Ceci affiche les noms de fichier:

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

... et cela affiche les noms de fichiers et leur contenu:

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

Pour effectuer une recherche récursive dans le répertoire actuel:

grep -r 'myString' .
5
AB Abhi

Si vous avez besoin d'une recherche récursive, vous avez une variété d'options. Vous devriez envisager ack .

Sinon, si vous avez GNU find et xargs:

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

L’utilisation de /dev/null vous permet d’obtenir les noms de fichiers imprimés; les -print0 et -0 traitent des noms de fichiers contenant des espaces (nouvelles lignes, etc.).

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

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

Cela pourrait prendre quelques noms que vous n'aviez pas prévus, car la correspondance de motif est plus floue (mais plus simple), mais fonctionne autrement. Et cela fonctionne avec les versions non-GNU de find et xargs.

4
Jonathan Leffler
grep -l hello **/*.{h,cc}

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

2
glenn jackman