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?
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:
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)
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
-R
ne fonctionne malheureusement pas. Il étend le *
avant d'aller récursivement.
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.
-print0
aprè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
.
find -exec +
syntaxe au lieu de xargs
-exec grep "hello" {} +
où la paire d'accolades représente le (s) nom (s) de fichier. Bonne suggestion.
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 find
et xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
L'utilisation de /dev/null
garantit que vous obtenez les noms de fichiers imprimés; les -print0
et -0
traite 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 find
et xargs
.
find ... -exec grep "hello" {} +
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)$'`
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.
Le moyen le plus simple: grep -Ril "Votre texte" /
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