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?

Réponses:


22

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

grep -lr --include='*.c' search-pattern .

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.)

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"

2
La question porte sur la recherche d'un modèle non sur la recherche dans un fichier.
Jay
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.