web-dev-qa-db-fra.com

grep, mais seulement certaines extensions de fichiers

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

Je veux grep seulement .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 protected]

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

835
Jason

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

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

cela devrait faire ce que vous voulez.

Notes de syntaxe:

  • -r - recherche récursive
  • -i - case -insensible recherche
  • --include=\*.${file_extension} - recherche dans les fichiers correspondant à l'extension (s) ou au modèle de fichier uniquement
1171
Nelson

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

Révolution PHP: Comment Grep des fichiers sous Linux, mais seulement certaines extensions de fichiers?

À savoir:

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: all * .txt: fichiers texte (d'échappement avec\juste au cas où vous auriez un répertoire avec des astérisques dans les noms de fichiers)

  • 'searchterm': Quoi chercher

  • ./: Commence au répertoire actuel.

251
HoldOffHunger

Que diriez-vous:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
48
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
46
Yuri Malov

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

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

-i est destiné à la recherche de chaîne sans tenir compte de la casse

15
Sam B

Comme il s’agit de trouver des fichiers , utilisons find!

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

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

Ensuite, il suffit d’exécuter 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 find, vous devez utiliser une approche telle que Amir Afghani , en utilisant -o pour concaténer les options (, le nom est soit se terminant par .h ou par .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 à --include:

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

Le plus simple est

find . -type  f -name '*.extension' | xargs grep -i string 
7
user3640130

La réponse ci-dessous est bonne.

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

Mais peut être mis à jour pour:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

Ce qui peut être plus simple.

3
hao

ag (le chercheur d'argent) a une syntaxe assez simple pour cela

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

alors

ag -G *.h -G *.cpp CP_Image <path>
2
Eldamir

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 aussi besoin du numéro de ligne:

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

Devrait écrire "-exec grep" pour chaque "-o -name"

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

Ou regroupez-les par ()

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

l'option '-Hn' affiche le nom du fichier et la ligne.

1
where23