Pagina 1 di 2

grep???

Inviato: lun 10 dic 2007, 14:21
da zosty
Devo cercare una stringa all'interno di tutti i files con estensione *.c contenuti in una directory e sottodirectory. Qual e' il comando da usare?
Pensavo che grep -R "stringa" /dir/*c funzionasse....

Grazie!
Z

Inviato: lun 10 dic 2007, 14:34
da anycolouryoulike
Non so se è il metodo migliore ma funziona di sicuro:

Codice: Seleziona tutto

ls -R <directory>/*.c | xargs grep <stringa>

Inviato: lun 10 dic 2007, 14:40
da albatros

Codice: Seleziona tutto

 find . -depth -name "*.c" -exec grep -H "scanf" {} \;
Questo esempio cerca nella directory corrente e nella sottodirectory i file con estensione .c nei quali cerca la stringa scanf e stampa poi il rigo con tale stringa preceduto dal nome del file (opzione -H).

Re: grep???

Inviato: lun 10 dic 2007, 14:42
da Paoletta
zosty ha scritto:Devo cercare una stringa all'interno di tutti i files con estensione *.c contenuti in una directory e sottodirectory. Qual e' il comando da usare?
Pensavo che grep -R "stringa" /dir/*c funzionasse....

Grazie!
Z

Codice: Seleziona tutto

 find /home/zosty/ltib-imx21ads-20070609/ -iname "*c"

Inviato: lun 10 dic 2007, 14:42
da zosty
anycolouryoulike ha scritto:Non so se è il metodo migliore ma funziona di sicuro:

Codice: Seleziona tutto

ls -R <directory>/*.c | xargs grep <stringa>
Ho provato....ma il risultato e' stato alquanto sconcertante...

Codice: Seleziona tutto

bash-3.1# ls -R /home/zosty/ltib-imx21ads-20070609/*.c | xargs grep lcd
ls: cannot access /home/zosty/ltib-imx21ads-20070609/*.c: No such file or directory
Garantisco che all'interno della dir ci sono una marea di files con estensione c....
Ed ho eseguito il comando come root :(

Inviato: lun 10 dic 2007, 14:42
da Paoletta
guarda sopra

p.s. il motivo per cui grep non fa quel che vuoi è che grep cerca all'interno dei files

Inviato: lun 10 dic 2007, 14:47
da zosty
albatros ha scritto:

Codice: Seleziona tutto

 find . -depth -name "*.c" -exec grep -H "scanf" {} \;
Questo esempio cerca nella directory corrente e nella sottodirectory i file con estensione .c nei quali cerca la stringa scanf e stampa poi il rigo con tale stringa preceduto dal nome del file (opzione -H).
GRAZIE MILLE!!!
Funziona benissimo....come speravo! ;)

Inviato: lun 10 dic 2007, 14:56
da albatros
Prego... ;)

Avevo aggiunto pochi minuti fa al post precedente la spiegazione del perché il tuo tentativo non funzionava, poi ho visto che ci sono stati altri interventi e ho rieditato tagliando e incollando qui di seguito:
Pensavo che grep -R "stringa" /dir/*c funzionasse....
In questo caso bash espande /dir/*c nei file che finiscono per c sotto la directory dir e li passa a grep, praticamente se hai in dir:
uno (file)
due (directory)
tre.c (directory)
quattro.c (file)

è come se avessi dato: grep -R "stringa" tre.c quattro.c , per cui grep cercherà stringa in quattro.c e in *tutti* i files contenuti in tre.c, saltando però la directory due.

Inviato: lun 10 dic 2007, 14:56
da anycolouryoulike
È vero. :oops: Con l'opzione -R non ha senso specificare i file di una directory...
Mi correggo:

Codice: Seleziona tutto

ls -R <directory> | grep .c | xargs grep <stringa>
Certo è molto meglio usare find come ti è stato indicato da gente molto più competente di me!

Inviato: lun 10 dic 2007, 15:04
da Mario Vanoni
zosty ha scritto:
anycolouryoulike ha scritto:Non so se è il metodo migliore ma funziona di sicuro:

Codice: Seleziona tutto

ls -R <directory>/*.c | xargs grep <stringa>
Ho provato....ma il risultato e' stato alquanto sconcertante...

Codice: Seleziona tutto

bash-3.1# ls -R /home/zosty/ltib-imx21ads-20070609/*.c | xargs grep lcd
ls: cannot access /home/zosty/ltib-imx21ads-20070609/*.c: No such file or directory
Garantisco che all'interno della dir ci sono una marea di files con estensione c....
Ed ho eseguito il comando come root :(
Quale Super-User (root):

cd directory_di_ricerca

find -name '*.c' -print | xargs -n 100 grep -n 'stringa_ricercata' | less

ti da la anche la riga dove si trova stringa_ricercata nel file trovato.

Mario Vanoni

Inviato: lun 10 dic 2007, 15:25
da anycolouryoulike
anycolouryoulike ha scritto:È vero. :oops: Con l'opzione -R non ha senso specificare i file di una directory...
Mi correggo:

Codice: Seleziona tutto

ls -R <directory> | grep .c | xargs grep <stringa>
Certo è molto meglio usare find come ti è stato indicato da gente molto più competente di me!
Non è vero, manco così funziona perché ls non specifica il percorso completo dei file. :lol:

Inviato: lun 10 dic 2007, 15:32
da albatros
@anycolouryoulike:
Penso sia un discorso di regex...
Ora non ho tempo per pensarci bene (la prima cosa che avevo scritto pochi minuti fa al posto di questa non era corretta), per curiosità ci ripenserò stasera...

Inviato: lun 10 dic 2007, 15:42
da anycolouryoulike
Ma infatti ls seleziona i file, poi xargs li passa ad uno ad uno a grep... solo che l'output di ls non include il path completo dei file, quindi grep non li trova nel caso i file non siano nella directory corrente!
Insomma, è inutile discutere, la soluzione migliore è la tua, anche se non so nemmeno cosa servano le opzioni -depth e -H :lol:
Sarebbe interessante aprire una sezione del forum sulla Bash...

Inviato: lun 10 dic 2007, 15:44
da anycolouryoulike
albatros ha scritto:@anycolouryoulike:
Penso sia un discorso di regex...
Ora non ho tempo per pensarci bene (la prima cosa che avevo scritto pochi minuti fa al posto di questa non era corretta), per curiosità ci ripenserò stasera...
Il mio precedente post era riferito alla tua precedente risposta... :lol:

Inviato: lun 10 dic 2007, 15:46
da conraid
anycolouryoulike ha scritto: Insomma, è inutile discutere, la soluzione migliore è la tua, anche se non so nemmeno cosa servano le opzioni -depth e -H :lol:
Sarebbe interessante aprire una sezione del forum sulla Bash...
Non per fare il pignolo, ma find è un comando indipendente dalla Bash.
Per le opzioni man find ;-)