it-swarm-eu.dev

grep ricorsivo: esclude directory specifiche

Uso grep ricorsivo molto per trovare i file sorgenti con contenuti specifici.

grep -Rni "myfunc" .

Sulle codebase di grandi dimensioni, questo può rallentare, quindi uso --incldue per limitare/inserire nella lista bianca le estensioni.

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

Tuttavia, sarebbe più efficiente escludere (Prune) intere sottodirectory, sto pensando:

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

Ma l'opzione --exclude supporta solo modelli di file come * .Java sopra. Come posso escludere le directory?

47
gabor

Potresti esaminare ack .

Ho appena iniziato a usarlo ma sembra adatto per questo.

10
Alex Feinman
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

Fonte: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using

60
Henrik

puoi usare find invece:

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

OK, quindi è un po 'indietro, ottieni prima i risultati di grep e poi il percorso. Forse qualcun altro ha una risposta migliore?

6
Josh

Ecco un esempio completo di uno script in uno dei miei progetti che potrebbe aiutare, chiamo questo file "all_source" (contrassegnato come eseguibile) e lo metto nella directory principale del mio progetto quindi lo chiamo come grep myfunc $(./all_source) l'ordinamento alla fine dello script è totalmente facoltativo.

#!/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

Questo script restituisce tutti i nomi di file nel progetto che corrispondono a *.h, *.cpp, *.c, *.lua, *.*awk, ma non esegue la ricerca in tutte le cartelle denominate .svn e gen, oltre a saltare le cartelle per ./lib e ./vc6 (ma solo quelle direttamente dalla radice del progetto). Quindi quando fai grep myfunc $(./all_source), si limita a fare il greps in quei file. Dovrai chiamare questo anche dalla directory principale del progetto.

2
Mike Nelson

C'è anche l'opzione -Prune per trovare:

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

Puoi provare a fare questo:

grep -R  "myfunc" . | grep -v path_to_exclude/

Ad esempio: se non si desidera cercare il contenuto nei file di registro, effettuare le seguenti operazioni:

grep -R "myfunc" . | grep -v log/
0
Akshatha