In bash voglio restituire il nome del file (e il percorso del file) per ogni file di tipo .php|.html|.js
contenente la stringa senza distinzione tra maiuscole e minuscole"document.cookie" | "setcookie"
Come potrei farlo?
In bash voglio restituire il nome del file (e il percorso del file) per ogni file di tipo .php|.html|.js
contenente la stringa senza distinzione tra maiuscole e minuscole"document.cookie" | "setcookie"
Come potrei farlo?
Risposte:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
La r
bandiera significa cercare ricorsivamente (cercare sottodirectory). La i
bandiera 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)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
su Ubuntu Desktop 16; qualche suggerimento?
--include=\*.{php,html,js}
Prova qualcosa del genere grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
lo -i
rende insensibile
l' .
ai mezzi finali si desidera avviare dalla directory corrente, questo potrebbe essere sostituito con qualsiasi directory.
i -r
mezzi lo fanno ricorsivamente, proprio sotto l'albero delle directory
la -n
stampa il numero di riga per le partite.
il --include
consente di aggiungere i nomi dei file, le estensioni. Carte jolly accettate
Per maggiori informazioni, consultare: http://www.gnu.org/software/grep/
-l
opzione (basta stampare i nomi dei file che corrispondono) invece di-n
find
loro e grep
per 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)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
nella directory weigth ~ 500Gb.
Sembra un lavoro perfetto per grep
o forse ack
O questa meravigliosa costruzione:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
-exec grep...
è migliore del mio xargs
metodo perché non si strozzerà 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.
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-extended
dice find
che tipo di regex aspettarsi-regex "^.*\.(php|html|js)$"
dice find
alla regex stessa che i nomi dei file devono corrispondere-exec grep -EH '(document\.cookie|setcookie)' {} \;
dice find
di eseguire il comando (con le sue opzioni e argomenti) specificato tra l' -exec
opzione e il \;
per ogni file che trova, dove {}
rappresenta dove va il percorso del file in questo comando.
mentre
E
opzione dice grep
di usare regex esteso (per supportare le parentesi) e ...H
opzione dice grep
di 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 find
al comando successivo dopo questo (che è sed
, quindi sort
)r
opzione dice sed
di usare regex esteso.s/HI/BYE/
dice sed
di 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.u
dice all'ordinamento di rimuovere le voci duplicate (prendere sort -u
come 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).