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
              -Rne 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 findet xargspour plus de détails.
-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.
                    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 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.
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