2014-07-10 13 views
6

Sto cercando una stringa particolare (principalmente nei file .c) in modo ricorsivo dalla directory principale.ricorsione grep - incoerenze

Quando lo uso, ottengo una lista quasi immediatamente.

grep -rl "F_capture" . 

Tuttavia, se tento di accelerare le cose da solo la ricerca dei file .c:

grep -r --include=*.c "F_capture" . 

io alla fine con un gran numero di avvisi di directory ricorsive in questo modo:

grep: warning: ./sys/block/fd0/device/bus/drivers/i8042/i8042/serio1/input:event1/subsystem/event3/device/bus/drivers/pcnet32/0000:00:03.0/subsystem: recursive directory loop 

Quando ho provato a sopprimere gli avvertimenti usando il parametro -s, non ricevo gli avvertimenti, ma non ottengo nulla neanche indietro - sembra che stia andando verso il mai e poi mai atterrare.

grep -rsl --include="*.c" "F_capture" . 

Quindi credo che la mia domanda è, perché il primo grep ho usato subito il ritorno qualcosa e gli altri tipi di dove sto rivolte un tipo specifico di file di sembra di riagganciare. Penserei che la ricerca mirata sarebbe più veloce.

+2

Sembra un BUG. '-r' seguendo i collegamenti simbolici solo se si trovano sulla riga di comando. Sembra che '--include' rompa questo, e il grep cerchi di seguire i collegamenti simbolici. – jm666

+0

Ricevi gli stessi errori quando provi '--include = *. C' (come nella tua seconda riga sopra citata) e' --include = "*. C" '(come nella tua quarta riga citata sopra)? In caso contrario, cosa ottieni da 'shopt | grep glob' (supponendo che tu stia usando bash)? – dg99

+0

dg99 - sì, se tolgo l'opzione -s, ottengo gli stessi errori se uso "* .c" o * .c. Quando digito shopt | grep glob Ho una lista di "glob" - tutti spenti. – stackbacker

risposta

1

Si può provare questo:

find . -type f -name "*.c" -print|xargs grep -l "F_capture" 
+1

Cambia '-print' in' -print0' e cambia 'xargs' in' xargs -0' e questo codice supporterà gli spazi: 'find. -type f -name "* .c" -print0 | xargs -0 grep -l "F_capture" '. Questo potrebbe anche usare qualche spiegazione. –

0

provare il seguente comando:

grep "F_capture" `find -type f -name "*.c"`