Trova i file contenenti un determinato testo


153

In bash voglio restituire il nome del file (e il percorso del file) per ogni file di tipo .php|.html|.jscontenente la stringa senza distinzione tra maiuscole e minuscole"document.cookie" | "setcookie"

Come potrei farlo?


4
Hai mai considerato di usare grep? cyberciti.biz/faq/grep-in-bash
Terrance

Questo titolo è abbastanza fuorviante. "trova-file-contenente-un-dato-testo"
Josh C

Risposte:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

La rbandiera significa cercare ricorsivamente (cercare sottodirectory). La ibandiera indica la distinzione tra maiuscole e minuscole.

Se vuoi solo i nomi dei file aggiungi il flag l(minuscolo L):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

che non sembra funzionare per me (almeno non su Mac) .... si blocca ... egrep -lir --include = * "repo" egrep: avviso: ricerca ricorsiva di stdin
Dean Hiller

13
Hai dimenticato di aggiungere il percorso per la ricerca. Il percorso è "." nell'esempio sopra. Nel tuo caso, lo script è in attesa dell'ingresso per la ricerca su stdin. Prova: egrep -lir --include = * "repo" / (o qualsiasi altro percorso)
LodeRunner

1
grep -E ... >egrep ...
Aman,

Ho riscontrato un errore grep: (error|fail): No such file or directorysu Ubuntu Desktop 16; qualche suggerimento?
Nam G VU,

Per farlo funzionare, ho dovuto saltare * con \. così ho--include=\*.{php,html,js}
Mehrad Mahmoudian,

53

Prova qualcosa del genere grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

lo -irende insensibile

l' .ai mezzi finali si desidera avviare dalla directory corrente, questo potrebbe essere sostituito con qualsiasi directory.

i -rmezzi lo fanno ricorsivamente, proprio sotto l'albero delle directory

la -nstampa il numero di riga per le partite.

il --includeconsente di aggiungere i nomi dei file, le estensioni. Carte jolly accettate

Per maggiori informazioni, consultare: http://www.gnu.org/software/grep/


4
O forse usa l' -lopzione (basta stampare i nomi dei file che corrispondono) invece di-n
glenn jackman,

15

findloro e grepper la stringa:

Questo troverà tutti i file dei tuoi 3 tipi in / partenza / percorso e grep per l'espressione regolare '(document\.cookie|setcookie)'. Dividi su 2 righe con la barra rovesciata solo per leggibilità ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
Come l'uso universale di find, ma secondo me meglio usare-exec grep -l 'sth' {} \;
NGix il

Grazie @Michael Berkowski In questo modo più veloce più di 5 o 8 volte # egrep -ir --include=file.foo "(foo|bar)" /dirnella directory weigth ~ 500Gb.
Qh0stM4N

9

Sembra un lavoro perfetto per grepo forse ack

O questa meravigliosa costruzione:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

+1 L'uso -exec grep...è migliore del mio xargsmetodo perché non si strozzerà con gli spazi nei nomi dei file.
Michael Berkowski,

@MichaelBerkowski: è possibile utilizzare in questo modo a che fare con gli spazi nei nomi dei file: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Naturalmente, anche le altre opzioni possono essere aggiunte.
Pascal,

4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

3

Solo per includere un'altra alternativa, puoi anche usare questo:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Dove:

  • -regextype posix-extendeddice findche tipo di regex aspettarsi
  • -regex "^.*\.(php|html|js)$"dice findalla regex stessa che i nomi dei file devono corrispondere
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;dice finddi eseguire il comando (con le sue opzioni e argomenti) specificato tra l' -execopzione e il \;per ogni file che trova, dove {}rappresenta dove va il percorso del file in questo comando.

    mentre

    • Eopzione dice grepdi usare regex esteso (per supportare le parentesi) e ...
    • Hopzione dice grepdi stampare i percorsi dei file prima delle partite.

E, dato questo, se vuoi solo percorsi di file, puoi usare:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Dove

  • |[pipe] invia l'output di findal comando successivo dopo questo (che è sed, quindi sort)
  • ropzione dice seddi usare regex esteso.
  • s/HI/BYE/dice seddi sostituire ogni prima occorrenza (per riga) di "HI" con "BYE" e ...
  • s/(^.*):.*$/\1/gli dice di sostituire la regex (^.*):.*$(che significa un gruppo [cose racchiuse da ()] includendo tutto [ .*= uno o più di qualsiasi carattere] dall'inizio della riga [ ^] fino a "il primo": "seguito da qualsiasi cosa fino a" la fine di riga [ $]) dal primo gruppo [ \1] della regex sostituita.
  • udice all'ordinamento di rimuovere le voci duplicate (prendere sort -ucome facoltativo).

... LONTANO dall'essere il modo più elegante. Come ho detto, la mia intenzione è quella di aumentare la gamma di possibilità (e anche di dare spiegazioni più complete su alcuni strumenti che potresti usare).

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.