Grep dans des fichiers avec une extension spécifique dans un répertoire

11

Existe-t-il une commande permettant de rechercher un mot-clé dans des fichiers sous un répertoire avec une extension spécifique?

La chaîne grep -irn "string" ./pathdonne une recherche récursive pour tous les fichiers du répertoire ./path. Mon besoin spécifique est de rechercher dans tous les fichiers sous ./pathavec une extension telle que*.h

Ginu Jacob
la source

Réponses:

11

Après quelques essais, je pense que grep -irn 'string' --include '*.h'c'est plus pratique

Ginu Jacob
la source
1
Si vous voulez faire cela, assurez-vous de mettre les "*.h"guillemets.
G-Man
Cela fonctionne avec et sans guillemets
Ginu Jacob
3
Maintenant c'est le cas. Essayez de créer un fichier appelé foobar.hdans le répertoire actuel et essayez à nouveau.
G-Man
10

S et (activer) le sh ell opt ion globstaravec la commande

    shopt -s globstar

Cela fera en sorte **qu'un composant de nom de fichier signifie tout ici et ci-dessous. Cela path/**signifie donc tout dans le pathrépertoire et ses sous-répertoires . (Vous n'avez pas besoin de taper ./ici.) Ensuite, vous pouvez utiliser

grep -in "string" path/**/*.h

pour rechercher tous les .hfichiers dans et sous path.


Vous pouvez u nset options avec shopt -u.

G-Man
la source
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ipor Sircer
la source
1
-exec... +c'est bien aussi.
G-Man le
1
Je viens de remarquer - vous avez oublié d'inclure "string"dans votre réponse!
G-Man le
3

Si vous pouvez installer quelque chose sur votre machine, je suggère d'utiliser ack .

Vous pouvez faire exactement ce dont vous avez besoin et bien plus encore. Pour votre cas d'utilisation, vous pouvez faire:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filtres sur les fichiers h
  • -i ignore le cas

Pour rechercher les filtres de fichiers pris en charge de manière native, exécutez la commande ack --help=type.

UN D
la source
Il y a aussi ag , un ancien clone de ack. Anciens, car leurs ensembles de caractéristiques ont quelque peu divergé depuis.
8bittree
Je ne savais pas ag. Merci d'avoir partagé.
AD
3

Qu'en est-il de celui-ci?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Explication:

  • -L: suivre les liens symboliques
  • -name: en utilisant l'astérisque, vous pouvez décrire les extensions
  • -in: identique à votre proposition, mais le "r" est remplacé par la findcommande
  • {}: cela représente le résultat de la findcommande
  • \; : dans le cas où vous combinez findavec -exec, c'est le spécificateur de fin de commande
Dominique
la source
1
Comment ça "*.h"marche? J'aurais pensé qu'il fallait l'être'*.h'
Joe, le
Je travaille toujours avec des guillemets doubles, je ne pense pas que cela fasse une différence.
Dominique
0

Si vous utilisez gnu grep, alors il y a un drapeau qui fait exactement ce que vous voulez:

grep -irn --include=\*.h "string" path

bien que je ne pense pas qu'il soit disponible dans d'autres greps.

plnu
la source