53 votes

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

J'utilise beaucoup le grep récursif pour trouver des fichiers sources au contenu spécifique.

grep -Rni "myfunc" .

Sur des bases de code importantes, cela peut devenir lent, c'est pourquoi j'utilise --incldue pour restreindre les extensions ou les mettre sur liste blanche.

grep -Rni --include=*.java "myfunc" .

Cependant, je pense qu'il serait plus efficace d'exclure (élaguer) des sous-répertoires entiers :

grep -Rni --exclude=/.svn/ "myfunc" .

Mais l'option --exclude ne prend en charge que les modèles de fichiers comme *.java ci-dessus. Comment puis-je exclure des répertoires ?

70voto

Cristian Meneses Points 143
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

10voto

James Points 23109

Vous pouvez vous renseigner sur ack .

Je viens de commencer à l'utiliser, mais il semble bien adapté à cette tâche.

6voto

Metaphox Points 139

Vous pouvez utiliser find à la place :

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

OK, c'est un peu à l'envers, vous obtenez les résultats de grep en premier et puis le chemin. Peut-être que quelqu'un d'autre a une meilleure réponse ?

2voto

Mike Nelson Points 111

Voici un exemple complet d'un script dans l'un de mes projets qui pourrait vous aider, j'appelle ce fichier "all_source" (marqué comme exécutable) et je le place 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 facultatif.

#!/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 qui correspondent à *.h, *.cpp, *.c, *.lua, *.*awk mais ne cherche pas dans tous les dossiers nommés .svn et dans les dossiers gen, et ignore les dossiers de ./lib y ./vc6 (mais seulement ceux qui se trouvent à la racine du projet). Ainsi, lorsque vous faites grep myfunc $(./all_source) il ne recherche que dans ces fichiers. Vous devrez également l'appeler depuis le répertoire racine du projet.

0voto

Denis Points 43

Il existe également l'option -prune pour trouver :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X