Trouver des mots dans plusieurs fichiers

2

Je cherche ça struct messages_sdd_t et je dois chercher dans beaucoup de fichiers * .c pour le trouver. Cependant, je ne vois pas comment trouver une correspondance car je veux exclure tous les mots "struct" et "messages_sdd_t". Comme je veux effectuer une recherche sur cette seule structure, 'struct messages_sdd_t', la raison en est que struct est utilisé à plusieurs reprises et que je continue à obtenir des pages ou des résultats de recherche.

Je l'ai fait sans succès:

find . -type f -name '*.c' | xargs grep 'struct messages_sdd_t'

et ça

find . -type f -name '*.c' | xargs egrep -w 'struct|messages_sdd_t'

Merci beaucoup pour vos suggestions,

ant2009
la source

Réponses:

5

Utilisation ack :

ack "struct messages_sdd_t" * .c

Il est de recours par défaut et il est beaucoup plus rapide que grep (selon mon observation) lors de la recherche dans un répertoire contenant des tonnes de code source.

Si vous ne voulez pas utiliser ack, grep devrait être bon aussi:

grep -r "struct messages_sdd_t" * .c

Ivan Petrushev
la source
1
Certainement +1 pour me faire comprendre, après toutes ces longues années, que grep a une option -r ...
DevSolar
"grep -r" est une très bonne réponse. Le problème avec find | xargs est que s'il y a beaucoup de fichiers, vous obtiendrez un message d'erreur "liste d'arguments trop longue". Vous pouvez utiliser le commutateur -n pour xargs pour éviter cela, mais vous devez ensuite définir le commutateur -H pour grep afin de vous assurer qu'il préfixe le nom du fichier. Il y a un avantage à utiliser "find | xargs" au lieu de "grep -r": vous pouvez filtrer de manière arbitraire les fichiers que vous souhaitez rechercher.
petersohn
Ack reconnaît C comme un type de fichier. Utilisez "ack 'struct messages_sdd_t' --cc" pour trouver tous les fichiers C, y compris les fichiers d'en-tête .h.
Andy Lester
@petersohn: xargs n'échoue pas de cette façon. Il utilise la valeur système de la longueur maximale de l'argument et se divise en conséquence. Courir xargs --show-limits pour voir ce qu'il utilise sur votre système spécifique. Si on a besoin d'utiliser find, c’est aussi bien de voir le -exec command {} + construire dans le manuel qui va plus ou moins imiter xargs directement dans la commande de recherche, avec le moins d'appels possible de sous-processus.
Daniel Andersson
@ ant2009: La réponse donnée est incorrecte car elle ne pas rechercher de manière récursive lorsque les noms de fichiers sont fournis comme arguments. Il ne cherchera que dans le .c fichiers dans le répertoire en cours, pas sous-répertoires.
Daniel Andersson
1
find . -type f -name '*.c' -exec grep 'struct\s\+messages_sdd_t' {} \;

Ou si vous ne vous souciez que du nom de fichier:

find . -type f -name '*.c' -exec grep -q 'struct\s\+messages_sdd_t' {} \; -print
Ignacio Vazquez-Abrams
la source
dans ce cas xargs pourrait être mieux que -exec; -exec va générer un processus grep pour chaque fichier.
quack quixote
Non, l'exécutif ne fait pas ça - {} \; Est-ce que. Si tu utilises {} +, plusieurs fichiers seront traités par un seul processus grep.
DevSolar
Que diriez-vous grep -l au lieu de grep -q -print?
DevSolar
1
grep -R --include='*.c' 'struct messages_sdd_t' .

Cela va chercher récursivement et utiliser grep lui-même pour choisir seulement .c des dossiers.

Envisagez d'ajouter -H toujours écrire le nom du fichier avec la correspondance de ligne.

Daniel Andersson
la source