Come posso usare grep per trovare una parola all'interno di una cartella?


542

In Windows, avrei fatto una ricerca per trovare una parola all'interno di una cartella. Allo stesso modo, voglio sapere se una parola specifica si trova all'interno di una directory contenente molte sottodirectory e file. Le mie ricerche per la sintassi grep mostrano che devo specificare il nome del file, cioè grep string filename.

Ora, non conosco il nome del file, quindi cosa devo fare? Un amico mi ha suggerito di fare grep -nr string, ma non so cosa significhi e non ho ottenuto risultati (non c'è risposta fino a quando non emetto a ctrl + c).

Risposte:


849
grep -nr 'yourString*' .

Il punto alla fine cerca la directory corrente. Significato per ogni parametro:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Sarebbe trovare MobileAppServlet.javao MobileAppServlet.classo MobileAppServlet.txt; 'MobileAppASer*.*'è un altro modo di fare la stessa cosa.)

Per controllare più parametri usa il comando man grep .


14
Di cosa si occupa *? Ciò comporterà l'espansione dei caratteri jolly della shell (se ci sono nomi di file corrispondenti al modello di caratteri jolly) o grep lo prenderà come operatore di ripetizione 0 o più per il carattere che precede *.
usta

7
Consideriamo ora due possibilità per grep -nr MobileAppSer* .1. Supponiamo di avere 3 file nella directory corrente di corrispondenza MobileAppSer*modello jolly: nome MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Poi grepsarà invocato in questo modo: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Significa cercare "MobileAppServlet.class" nei file MobileAppServlet.java, MobileAppServlet.txt e altrove nella directory corrente, che sicuramente non è ciò che l'utente desidera qui.
usta

7
2. Nel caso in cui non ci siano file nella directory corrente che corrispondano al MobileAppSer*modello jolly, grepriceveranno l'argomento così MobileAppSer*com'è e quindi lo prenderanno come ricerca del testo "MobileAppSe" seguito da 0 o più occorrenze di "r", quindi tenta di trovare i testi "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", ecc. nel contenuto dei file della directory corrente, non ciò che l'utente desidera.
usta

5
Questa è una scelta dubbia di regex. Usta lo ha sottolineato.
kindasimple

117
grep -nr string my_directory

Note aggiuntive: questo soddisfa la sintassi grep [options] string filenameperché nei sistemi simili a Unix, una directory è un tipo di file (esiste un termine "file normale" che si riferisce specificamente alle entità che sono chiamate semplicemente "file" in Windows).

grep -nr string legge il contenuto da cercare dall'input standard, ecco perché aspetta solo input da te, e smette di farlo quando premi ^ C (si fermerebbe anche su ^ D, che è la combinazione di tasti per end-of -file).


1
Ehi, quindi se voglio cercare una stringa indipendentemente dal caso, devo farlo: grep -i -nr "la mia parola".
kiki,

2
@kiki: Sì, che equivale agrep -inr "my word" .
usta

16
@kiki: -rper grep significa cercare ricorsivamente nelle sottodirectory e -nsignifica prefissare ogni riga di output con il corrispondente numero di riga del file che contiene quella riga. man grepdescrive tutto questo e molto altro.
usta

62

GREP : Stampa di espressioni regolari globali / parser / processore / programma.
Puoi usarlo per cercare la directory corrente.
È possibile specificare -R per "ricorsivo", il che significa che il programma cerca in tutte le sottocartelle, nelle relative sottocartelle e nelle sottocartelle delle loro sottocartelle, ecc.

grep -R "your word" .

-nstamperà il numero di riga, dove corrispondeva al file.
-icercherà senza distinzione tra maiuscole e minuscole (maiuscole / non maiuscole).

grep -inR "your regex pattern" .

3
./* indica tutti i file nella directory corrente, -R significa ricorsivo (ricerca nelle sottodirectory ecc.)
Stefan Steiger

25
grep -nr search_string search_dir

eseguirà una ricerca RECURSIVE (ovvero la directory e tutte le sue sottodirectory) per search_string. (come correttamente risposto da usta).

Il motivo per cui non hai ricevuto alcuna risposta con il suggerimento del tuo amico di:

grep -nr string

è perché non è stata specificata alcuna directory. Se ci si trova nella directory in cui si desidera effettuare la ricerca, è necessario effettuare le seguenti operazioni:

grep -nr string .

È importante includere il '.' carattere, poiché questo dice a grep di cercare QUESTA directory.


Ciao, cosa devo fare se devo cercare 2 parole con uno spazio in mezzo? Le parole devono essere specificate tra virgolette? cioè grep -nr "la mia parola".
kiki,

24

C'è anche:

find directory_name -type f -print0 | xargs -0 grep -li word

ma potrebbe essere un po 'troppo per un principiante.

findè un walker / lister di directory per scopi generici, -type fsignifica "cercare file semplici anziché directory e named pipe e cosa hai", -print0significa "stamparli sull'output standard usando caratteri null come delimitatori". L'output da findviene inviato a xargs -0e ciò afferra il suo input standard in blocchi (per evitare le limitazioni della lunghezza della riga di comando) utilizzando caratteri null come separatore di record (anziché la nuova riga standard) e si applica grep -li worda ciascun set di file. Sul grep, -lsignifica "elenca i file corrispondenti" e -isignifica "insensibile al maiuscolo / minuscolo"; di solito puoi combinare le opzioni di un singolo personaggio in modo da vederlo -lipiù spesso di -l -i.

Se non si utilizza -print0e -0quindi si incontrano problemi con i nomi di file che contengono spazi, quindi usarli è una buona abitudine.


1
@mmmshuddup: grazie. Mi sento male se non do una spiegazione come parte della risposta, specialmente quando lavoro con un principiante.
mu è troppo corto il

1
Questo è quello che ho imparato ad apprezzare di più su questo sito. È importante ricordare che una volta eravamo tutti principianti e non è facile arrivare nel mondo della tecnologia!
Sì, Barry,

posso escludere determinate directory? @muistooshort
Ferologics,

@Ferologics Dovrebbe esserci, controlla man finddalla riga di comando per vedere quali opzioni sono findsupportate.
mu è troppo corto il

8

Perché non fare una ricerca ricorsiva per trovare tutte le istanze nelle sottodirectory:

grep -r 'text' *

Funziona come un fascino.


1
Non c'è bisogno di citare la stringa di ricerca senza caratteri speciali come gli spazi
Scott Stensland il

5
  1. grep -r "yourstring" * Troverà "yourstring" in qualsiasi file e cartella

Ora se vuoi cercare due stringhe diverse contemporaneamente puoi sempre usare l'opzione E e aggiungere parole per la ricerca. esempio dopo l'interruzione

  1. grep -rE "yourstring|yourotherstring|$" *cercherà le posizioni dell'elenco dove yourstringo yourotherstringcorrisponde

4

Un'altra opzione che mi piace usare:

find folder_name -type f -exec grep your_text  {} \;

-type f restituisce solo file e non cartelle

-exec e {} esegue il grep sui file trovati nella ricerca (la sintassi esatta è "-exec command {}").


4
grep -R "string" /directory/

-R segue anche i collegamenti simbolici quando -r no.


2

La risposta che hai selezionato va bene e funziona, ma non è il modo corretto di farlo, perché:

grep -nr yourString* .

Questo effettivamente cerca la stringa "yourStrin"e "g"0 o più volte.

Quindi il modo corretto per farlo è:

grep -nr \w*yourString\w* .

Questo comando cerca la stringa con qualsiasi carattere prima e dopo nella cartella corrente.


2
tuttavia grep -nr yourStringfunziona anche, in quanto cerca il nudo in yourStringqualsiasi punto della linea (o almeno sul mio sistema, OSX Lion)
theheadofabroom


1

Eseguire (terminale) il seguente comando all'interno della directory. Controllerà ricorsivamente anche all'interno delle sottodirectory.

grep -r 'your string goes here' * 

0

I seguenti sguardi di esempio in modo ricorsivo per your search stringla *.xmle *.jsfile da qualche situato all'interno delle cartelle path1, path2e path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Quindi puoi cercare in un sottoinsieme dei file molte directory, fornendo solo i percorsi alla fine.


-4

Non usare grep. Scarica Silver Searcher o ripgrep . Sono entrambi eccezionali e molto più veloci di grep o ack con tonnellate di opzioni.


2
Questi forse sono ottimi strumenti, ma questo non risponde al modo in cui li uso per realizzare ciò che l'OP sta chiedendo.
jmathew,
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.