web-dev-qa-db-fra.com

grep récursif: exclure des répertoires spécifiques

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?

47
gabor

Vous pourriez regarder dans ack .

Je viens tout juste de commencer à l'utiliser, mais cela semble bien adapté à cela.

10
Alex Feinman
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

60
Henrik

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?

6
Josh

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.

2
Mike Nelson

Il y a aussi l'option -Prune pour trouver:

 find . -path "*/.svn*" -Prune -o -not -type d -exec grep -ni "myfunc" {} \; -print
0
misiu_mp

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/
0
Akshatha