Rechercher une chaîne uniquement dans un fichier spécifique à l'intérieur des sous-répertoires

10

Disons que je dois trouver la fonction GetTypes()dans tous les fichiers source C # ( .cs) des répertoires / sous-répertoires.

J'ai utilisé grep -rn GetTypes *.cs, mais j'ai eu une erreur avec grep: *.cs: No such file or directory. J'ai dû utiliser grep -rn GetTypes *, mais dans ce cas, il montre non *.csseulement tous les fichiers .

Quelle commande dois-je utiliser pour rechercher la chaîne uniquement dans les .csfichiers?

prosseek
la source

Réponses:

12

Si votre coque est bash ≥4, insérez shopt -s globstarvotre ~/.bashrc. Si votre shell est zsh, vous êtes bon. Ensuite, vous pouvez exécuter

grep -n GetTypes **/*.cs

**/*.cssignifie tous les fichiers correspondant *.csdans le répertoire courant, ou dans ses sous-répertoires, récursivement.

Si vous n'exécutez pas un shell qui prend en charge **mais que votre grep le prend en charge --include, vous pouvez effectuer un grep récursif et indiquer grepde ne considérer que les fichiers correspondant à certains modèles. Notez les guillemets autour du modèle de nom de fichier: il est interprété par grep, pas par le shell.

grep -rn --include='*.cs' GetTypes .

Avec seulement des outils portables (certains systèmes n'en ont pas grep -rdu tout), utilisez findpour la partie traversée de répertoire et greppour la partie recherche de texte.

find . -name '*.cs' -exec grep -n GetTypes {} +
Gilles 'SO- arrête d'être méchant'
la source
Pour définir temporaire l' globstaroption pour un shell Bash 4+ courant, utilisez: shopt -s globstar.
tjanez
8

Vous devriez consulter le petit remplacement grep / find billiant appelé ack. Il est spécifiquement configuré pour rechercher dans les répertoires des fichiers de code source.

Votre commande ressemblerait à ceci:

ack --csharp GetTypes
Caleb
la source
4

Si vous utilisez GNU grep, vous pouvez spécifier les fichiers à inclure dans une traversée de répertoire récursive:

grep --include '*.cs' -rn GetTypes .

(où la dernière période désigne le répertoire de travail actuel comme racine du parcours)

maxschlepzig
la source
4

J'utilise une combinaison de find et grep:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

Pour find, vous pouvez remplacer .par un répertoire et supprimer -namesi vous souhaitez rechercher dans chaque fichier.

Pour grep, -bnimprimera la position et le numéro de ligne et --coloraidera vos yeux en mettant en évidence ce que vous recherchez.

Kevin
la source