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

Réponses:


11

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


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.


5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;

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.


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.