Grep ricorsivo non riesce per i file * .c


13

Ho provato a cercare ricorsivamente uno schema in tutti i file .c nel modo seguente

> grep -lr search-pattern *.c

Ma ho ottenuto questo come output

> grep: *.c: No such file or directory

Quando uso questo:

> grep -lr search-pattern *

Ne ho molti. c file nelle directory con il modello.

Cosa c'è di sbagliato nell'espressione precedente?

Risposte:


22

Suggerisco di usare l' --includeopzione di grep:

grep -lr --include='*.c' search-pattern .

1
+1. Non conoscevo l' --include=GLOBopzione. In combinazione con l'opzione ricorsiva, questo è molto potente e non richiede find. Bello!
gertvdijk,

In ritardo alla festa qui, ma sono confuso su ciò che .serve alla fine del comando.
Nathan Jones,

1
@NathanJones: grep richiede uno o più nomi di file o directory in cui cercare. Il punto dice: cerca nella directory corrente
enzotib,

3

Il *.cmodello viene valutato dalla shell. Si applica alla directory corrente, proprio come si userebbe ls *.c.

Penso che quello che vuoi invece sia trovare tutti i file corrispondenti allo *.cschema (ricorsivamente) e grepcercarti in esso. Ecco un modo per farlo:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Usa xargsper aggiungere i risultati della ricerca per find.


In alternativa, utilizzare l' -execopzione per trovare, ad esempio:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

Inoltre, non sono sicuro che tu voglia davvero l' -lopzione grep. Si fermerà alla prima partita:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)

La find/xargssintassi si interrompe su nomi di file contenenti spazi. L' -Lopzione di grepstop alla prima corrispondenza di ciascun file e continua con il file successivo: se si desidera vedere solo se il modello è contenuto almeno una volta in ciascun file, è più veloce.
enzotib,

@enzotib Grazie, risolto usando l' -print0opzione e xargs --null.
gertvdijk,

-1

So che questo è un thread piuttosto vecchio, ma dato che avevo la stessa domanda, voglio condividere il mio modo preferito di ottenere lo stesso, in una forma molto più breve.

ls | grep "file.*.c"

2
La domanda riguarda la ricerca di un modello e non la ricerca di un file.
Jay,
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.