Question grep, mais seulement certaines extensions de fichiers


Je travaille sur l'écriture de scripts pour grep certains répertoires, mais ces répertoires contiennent toutes sortes de types de fichiers.

je veux grep juste .h et .cpp pour l'instant, mais peut-être quelques autres dans le futur.

Jusqu'à présent j'ai:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP email@domain.com

Quelqu'un peut-il me montrer comment je voudrais maintenant ajouter seulement les extensions de fichier spécifiques?


649
2017-09-20 16:30


origine


Réponses:


Utilisez simplement le --include paramètre, comme ceci:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

cela devrait faire ce que vous voulez.

Notes de syntaxe:

  • -r - recherche récursive
  • -i - Cas-insensible chercher
  • --include=\*.${file_extension} - rechercher des fichiers correspondant à la ou aux extension (s) ou au modèle de fichier uniquement

910
2017-09-20 16:35



Certaines de ces réponses semblaient trop lourdes de syntaxe, ou elles ont généré des problèmes sur mon serveur Debian. Cela a fonctionné parfaitement pour moi.

grep -r --include=\*.txt 'searchterm' ./

... ou une version insensible à la casse ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: commande

  • -r: récursivement

  • -i: ignore-case

  • --include: tout * .txt: fichiers texte (échapper avec \ juste au cas où vous avez un répertoire avec des astérisques dans les noms de fichiers)

  • 'searchterm': Que chercher

  • ./: Commencez au répertoire actuel.


183
2018-02-08 22:46



Que diriez-vous:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

44
2017-09-20 16:33



grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./

38
2017-07-23 19:38



Il n'y a pas d'option -r sur les serveurs HP et Sun, ce qui a fonctionné pour moi sur mon serveur HP

find . -name "*.c" | xargs grep -i "my great text"

-i est pour la recherche insensible à la casse de la chaîne


12
2017-12-11 15:14



Puisque c'est une question de découverte fichiers, utilisons find!

En utilisant GNU find, vous pouvez utiliser le -regex option pour trouver ces fichiers dans l'arborescence des répertoires dont l'extension est soit .h ou .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Ensuite, c'est juste une question d'exécution grep sur chacun de ses résultats:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Si vous n'avez pas cette distribution de trouver, vous devez utiliser une approche comme Amir Afghani's, en utilisant -o concaténer les options (le nom se termine soit avec .h ou avec .cpp):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Et si vous voulez vraiment utiliser grep, suivez la syntaxe indiquée pour --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

7
2017-08-17 09:24



Je suis conscient que cette question est un peu datée, mais je voudrais partager la méthode que j'utilise normalement pour trouver .c et .h des dossiers:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

ou si vous avez besoin du numéro de ligne:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"

3
2018-03-13 11:17