Grep récursif échoue pour les fichiers * .c

13

J'ai essayé de rechercher récursivement un modèle dans tous les fichiers .c de la manière suivante

> grep -lr search-pattern *.c

Mais je l'ai comme sortie

> grep: *.c: No such file or directory

Quand j'utilise ceci:

> grep -lr search-pattern *

J'en reçois beaucoup. fichiers c dans les répertoires avec le motif.

Quel est le problème avec l'expression précédente?

Geai
la source

Réponses:

22

Je suggère d'utiliser l' --includeoption de grep:

grep -lr --include='*.c' search-pattern .
enzotib
la source
1
+1. Je ne connaissais pas l' --include=GLOBoption. En combinaison avec l'option récursive, c'est très puissant et ne nécessite pas find. Agréable!
gertvdijk
Tard dans la soirée ici, mais je ne sais pas à quoi .sert la fin du commandement.
Nathan Jones
1
@NathanJones: grep nécessite un ou plusieurs noms de fichiers ou répertoires dans lesquels effectuer la recherche. Le point dit: recherche dans l'annuaire actuel
enzotib
3

Le *.cmotif est évalué par votre shell. Il s'applique au répertoire actuel, comme vous le feriez avec ls *.c.

Je pense que ce que vous voulez à la place est de trouver tous les fichiers correspondant au *.cmotif (récursivement) et de vous y greprechercher. Voici une façon de procéder:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Il utilise xargspour ajouter les résultats de recherche par find.


Vous pouvez également utiliser l' -execoption pour rechercher, par exemple:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

De plus, je ne sais pas si vous voulez vraiment l' -loption grep. Il s'arrêtera au premier match:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)
gertvdijk
la source
Les find/xargspauses de syntaxe sur les noms de fichiers contenant des espaces. La -Lpossibilité d' greparrêter le premier match de chaque fichier et continuer avec le fichier suivant: si l' on veut seulement voir si le motif est contenu au moins une fois dans chaque fichier donné, il est plus rapide.
enzotib
@enzotib Merci, fixe à l'aide de l' -print0option et xargs --null.
gertvdijk
-1

Je sais que c'est un fil plutôt ancien, mais puisque j'avais la même question, je veux partager ma façon préférée de parvenir à la même chose, sous une forme beaucoup plus courte.

ls | grep "file.*.c"
Jebiel
la source
2
La question porte sur la recherche d'un modèle non sur la recherche dans un fichier.
Jay