153 votes

Comment puis-je utiliser grep pour rechercher dans le répertoire actuel tous les fichiers contenant la chaîne "hello" tout en n'affichant 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 ?

175voto

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

Ce qui donne : rechercher récursivement (dans tous les sous-répertoires également) tous les fichiers .cc OU .h qui contiennent "hello" à cette adresse . répertoire (actuel)

D'après une autre question de stackoverflow

9 votes

Dans le message original, vous avez dit "répertoire courant" et rien sur la nécessité de le faire de manière récursive ou dans les sous-répertoires (je réalise que vous l'avez mentionné dans un message ultérieur). Pour ceux qui souhaitent savoir comment le faire uniquement dans le répertoire courant, c'est grep -si "hello" --include=*.{cc,h} ./* ./.* (il 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 que la plupart généralement utile (et le plus simple), ceci recherche "hello" dans tous les fichiers non cachés : grep -si "hello" ./* Grâce à ce post : askubuntu.com/a/777456

1 votes

grep -r --include=*.{java,py} "hello" .

0 votes

Pour une raison quelconque, cela ne fonctionne pas sous macOS, même en utilisant l'utilitaire GNU grep.

50voto

Donald Miner Points 18116

Vous pouvez passer des jokers au lieu de spécifier des noms de fichiers ou d'utiliser stdin.

grep hello *.h *.cc

0 votes

J'ai besoin de tous les sous-répertoires également

0 votes

Ajout de -R ne fonctionne pas malheureusement. Il élargit le * avant de procéder par récurrence.

0 votes

La réponse de Noufal est celle que vous recherchez si vous avez besoin de sous-répertoires

19voto

Noufal Ibrahim Points 32200

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

Consultez les pages du manuel pour find y xargs pour les détails.

1 votes

Vous devez avoir un -print0 après le '*.cc' car sinon vous n'avez pas d'action pour cette partie de la recherche. Ou bien vous devez insérer des parenthèses à cet endroit : find . \( -name '*.cc' -or -name '*.h' \) -print0 .

0 votes

Merci de l'avoir remarqué. J'ai modifié la réponse pour le "corriger".

3 votes

Vous pouvez également utiliser le find -exec + au lieu de la syntaxe xargs

6voto

Jonathan Leffler Points 299946

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

A défaut, si vous avez GNU find y xargs :

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

L'utilisation de /dev/null vous assure d'obtenir l'impression des noms de fichiers ; l'option -print0 y -0 traite les 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

Il se peut que vous trouviez quelques noms que vous n'aviez pas l'intention d'utiliser, car la correspondance des motifs est plus floue (mais plus simple), mais sinon, cela fonctionne. Et cela fonctionne avec les versions non-GNU de find y xargs .

0 votes

Vous pouvez également dire find ... -exec grep "hello" {} +

2voto

glenn jackman Points 69748
grep -l hello **/*.{h,cc}

Vous pourriez vouloir shopt -s nullglob pour éviter les messages d'erreur s'il n'y a pas de fichiers .h ou .cc.

4 votes

Je sais comment utiliser Google, etc. J'ai posé la question ici parce que plusieurs réponses contiennent "-l" et qu'il est agréable d'avoir toutes les informations en un seul endroit.

0 votes

-l (el en minuscules) Supprime la sortie normale. Imprime le nom de chaque fichier d'entrée à partir duquel la sortie aurait normalement été imprimée. L'analyse/recherche s'arrête à la première correspondance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X