come eseguire l'operazione grep su tutti i file in una directory


218

Lavorando con xenserver, e voglio eseguire un comando su ogni file che si trova in una directory, estrarre alcune cose dall'output del comando e aggiungerlo in un file.

Sono chiaro sul comando che voglio usare e su come estrarre le stringhe secondo necessità.

Ma ciò su cui non sono chiaro è come devo eseguire questo comando su ciascun file, andando al successivo, fino a quando non vengono trovati più file.

Risposte:


228

grep $PATTERN *sarebbe sufficiente. Per impostazione predefinita, grep salta tutte le sottodirectory. Tuttavia, se vuoi superarli, grep -r $PATTERN *è il caso.


37
"grep -r $ PATTERN." è sufficiente. Per grep ricorsivo non è necessario specificare tutti i file
Cougar

1
Come posso includere più estensioni? Per esempio. "* .cpp", "* .h"?
Tomáš Zato - Ripristina Monica l'

1
@ Tomáš Zato, basta fornire tutti i vostri modelli di file, invece di *: grep $PATTERN *.cpp *.h. Se hai bisogno di regole più specifiche per quali file devono essere grepped, usa il findcomando (controlla la risposta di Rob).
umi,

@umi Se eseguo i grep -r x .risultati provengono da tutti i file di tutte le estensioni. Se corro di grep -r x *.scssquanto non ricevo risultati.
Chris,

1
@Chris è possibile che non ci siano *.scssfile nella directory corrente ma da qualche parte più in profondità nei sottodir, quindi grep non cerca in tutti i file desiderati. Dovresti usare l' --includeopzione per dire a grep di cercare ricorsivamente i file che corrispondono a schemi specifici: grep -r x --include '*.scss' . (nota le virgolette, impediscono che il motivo venga espanso dalla shell). O semplicemente usa find(vedi la risposta di Rob).
umi,

168

In Linux, di solito uso questo comando per ricorrere in modo ricorsivo a un particolare testo all'interno di una directory

grep -rni "string" *

dove,

r = ricorsivo, cioè cerca le sottodirectory nella directory corrente
n = per stampare i numeri di riga su stdout
i = ricerca senza distinzione tra maiuscole e minuscole


32

Usa trova. Seriamente, è il modo migliore perché poi puoi davvero vedere su quali file sta funzionando:

find . -name "*.sql" -exec grep -H "slow" {} \;

Nota, -H è specifico per Mac, mostra il nome del file nei risultati.


7
Se decidi di usare find, reindirizzare l'output xargsanziché utilizzarlo -execsarà molto più veloce, perché -execgenera un nuovo processo per ogni grep e l'overhead diventa significativo con un gran numero di file. Si applicano avvisi standard sugli spazi nei nomi dei file xargs.
Barton Chittenden,

2
Come sarebbe esattamente? Dimentico sempre la xargssintassi.
Brian Peterson,

3
@BrianPeterson sarebbe qualcosa del genere:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince il

4

Per cercare in tutte le sottodirectory, ma solo in tipi di file specifici , utilizzare grep con --include.

Ad esempio, cercando ricorsivamente nella directory corrente, il testo in * .yml e * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}

1

Se si desidera eseguire più comandi, è possibile utilizzare:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
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.