J'utilise beaucoup grep récursif pour trouver des fichiers source avec un contenu spécifique.
grep -Rni "myfunc" .
Sur de grandes bases de code, cela peut être lent, alors j'utilise --incldue pour restreindre les extensions/liste blanche.
grep -Rni --include=*.Java "myfunc" .
Cependant, il serait plus efficace d'exclure des sous-répertoires entiers (Prune), je pense:
grep -Rni --exclude=/.svn/ "myfunc" .
Mais --exclude ne prend en charge que les modèles de fichiers tels que * .Java ci-dessus. Comment puis-je exclure des répertoires?
Vous pourriez regarder dans ack .
Je viens tout juste de commencer à l'utiliser, mais cela semble bien adapté à cela.
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data
Source: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using
vous pouvez utiliser find à la place:
find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print
OK, donc c'est un peu en arrière, vous obtenez les résultats de grep et ensuite puis le chemin. Peut-être que quelqu'un d'autre a une meilleure réponse?
Voici un exemple complet d'un script dans l'un de mes projets qui pourrait aider, j'appelle ce fichier "all_source" (marqué comme exécutable) et le mets dans le répertoire racine de mon projet, puis je l'appelle comme suit: grep myfunc $(./all_source)
le tri à la fin du script est totalement optionnel.
#!/bin/bash
find . \
-type d \( \
-wholename './lib' -o \
-wholename './vc6' -o \
-name 'gen' -o \
-name '.svn' \
\) -Prune -o \
-type f \( \
-name '*.h' -o \
-name '*.cpp' -o \
-name '*.c' -o \
-name '*.lua' -o \
-name '*.*awk' \) -print \
| sort
Ce script renvoie tous les noms de fichiers du projet correspondant à *.h, *.cpp, *.c, *.lua, *.*awk
, mais ne recherche pas dans tous les dossiers nommés .svn et gen, ni ignore les dossiers pour ./lib
et ./vc6
(mais uniquement ceux situés à la racine du projet). Donc, lorsque vous faites grep myfunc $(./all_source)
, il ne fait que grisser dans ces fichiers. Vous devrez également appeler cela à partir du répertoire racine du projet.
Il y a aussi l'option -Prune pour trouver:
find . -path "*/.svn*" -Prune -o -not -type d -exec grep -ni "myfunc" {} \; -print
Vous pouvez essayer de faire ceci:
grep -R "myfunc" . | grep -v path_to_exclude/
Exemple: si vous ne souhaitez pas rechercher le contenu dans les fichiers journaux, procédez comme suit:
grep -R "myfunc" . | grep -v log/