2009-07-30 3 views
23

Quando uso il comando:Uso di grep per cercare i file forniti da find: cosa non va con find. | xargs grep '...'?

find . | xargs grep '...' 

ottengo le partite sbagliate. Sto cercando di cercare la stringa ... in tutti i file nella cartella corrente.

+3

Avete ulteriori esempi? –

+4

quindi, per prima cosa, devi imparare come fare la domanda, correttamente. tecnicamente, non c'è niente di sbagliato in questo. la domanda è cosa vuoi fare. descrivilo correttamente e chiaramente – ghostdog74

+0

vuoi dire, quello che ottengo come risposta? – cupakob

risposta

37

Come ha detto Andy White, è necessario utilizzare fgrep al fine di corrispondere per la pianura ., o la fuga i puntini.

Quindi si deve scrivere (-type f è di avere solo i file: ovviamente non si vuole le directory.):

find . -type f | xargs fgrep '...' 

o se si vuole ancora utilizzare grep:

find . -type f | xargs grep '\.\.\.' 

e se desideri solo la directory corrente e non le sue sottodirectory:

find . -maxdepth 1 -type f | xargs fgrep '...' 
+2

'grep -F '...'' dovrebbe funzionare altrettanto bene – Hasturkun

+2

@Hasturkun: Sì. Ho solo la tendenza a preferire nomi di comandi diversi rispetto alle opzioni extra (come usare 'gunzip' invece di' gzip -d'). Solitamente una questione di gusti. –

2

Se si sta letteralmente digitando grep '...' si combina praticamente qualsiasi stringa. Dubito che tu stia effettivamente digitando '...' per il comando grep, ma se lo sei, lo ... corrisponderà a qualsiasi tre caratteri.

Si prega di inviare più informazioni su ciò che stai cercando, e forse qualcuno può aiutarti di più.

1

Se siete alla ricerca di un nome di file che corrisponde, provare:

find . -name "filename pattern" 

o

find . | grep "filename pattern" 

Se la vostra ricerca per la ricerca di file quella partita (cioè contiene il stringa grep)

find . | xargs grep "string pattern" 

funziona correttamente. o più semplicemente:

grep "string pattern" -R * 
+0

sì, sto cercando i file che contengono "..." come stringa, ma: 1. trova. | xargs grep "string pattern" o 2. grep "string pattern" -R * non aiuta. – cupakob

7

"." corrisponde a qualsiasi carattere, quindi troverai tutte le linee che contengono 3 o più caratteri.

è possibile sfuggire i punti, come questo:

find . | xargs grep '\.\.\.' 

Oppure è possibile utilizzare fgrep, che fa una corrispondenza letterale, invece di un match regex:

find . | xargs fgrep '...' 

(Alcune versioni di grep accetta anche un flag -F che li fa comportarsi come fgrep.)

-1

Per completare la risposta di Jeremy, si potrebbe anche voler provare

find . -type f | xargs grep 'your_pattern' 

o

find . -type f -exec grep 'your_pattern' {} + 

che è simile a un xargs

potrei aggiungere: RTFM! O in un modo più gentile: utilizzare & abuso di

man command 

!

+1

Più educato? Leggi il manuale amichevole? Come potrebbe essere considerato scortese? Maniaco educato. :) –

+0

Le pagine man sono davvero piuttosto amichevoli e non vedono l'ora di essere lette ancora e ancora. (Hai reso la mia giornata, Jeremy XD) –

+0

Più tardi ottiene, più i miei commenti sembrano odiosi. Penso che sto raggiungendo il picco ora. È tutto in discesa da qui. –

5

@OP, se siete alla ricerca di file che contengono ...,

grep -R "\.\.\." * 
+1

Di gran lunga la soluzione più semplice. grep ha la ricerca di file ricorsiva integrata. – duckbrain