Escludere le sottodirectory nascoste da grep -r


22

Ho una copia locale svn, voglio fare una ricerca sulla stringa some_string.

$ grep some_string * -r
lang/en:some_string=Some string
lang/.svn/en:some_string=Some string

Ma se andiamo un po 'oltre, sembra che le directory nascoste di primo livello siano escluse:

$ cd lang && grep some_string * -r
en:some_string=Some string

Come posso rimuovere le directory svn nascoste dal mio output e non solo dal primo livello di profondità?

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string

Non è una risposta diretta, ma potresti voler provare ack .
depquid

Risposte:


21

Utilizzare l' --exclude-diropzione, ad esempio:

grep -r --exclude-dir='.*' some_string

Da man grep:

--exclude-dir=DIR
              Exclude directories matching the pattern DIR from recursive searches.

Nota, tuttavia, questa --exclude-diropzione è disponibile solo in GNU grep. Se il tuo grepnon lo supporta, potrebbe essere necessario utilizzare altri strumenti come trovare ad esempio :

find . \( -name .svn -prune \) -o -name "*" -exec grep -H "some_string" {} 2>/dev/null \;

Devo avere un Linux troppo vecchio ...
MUY Belgio,

Ho modificato la risposta, prova la findversione se il tuo grep non supporta --exclude-dir.
Jimmij,

Ho la versione grep versione 2.5.1 e non esiste alcun argomento --exclude-dir, e ho provato tutto ciò a cui pensavo ...
MUY Belgio

1
La seconda soluzione non usa --exclude-dir, l'hai provata?
jimmij,

Ho "opzione non riconosciuta"
MUY Belgio

1

Normalmente uso questo:

for e in $(find . -maxdepth 1 -type d); do echo ${e#\./}; done | grep -v '^\.'

${e%\./}rimuoverà il primo ./e quindi greprimuoverà tutto ciò che inizia con un punto.


Il codice dice e#, il testo dicee%
Stephen Rauch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.