2011-05-27 12 views
93

En bash quiero devolver el nombre del archivo (y la ruta del archivo) para cada archivo de tipo .php|.html|.js que contiene la cadena de mayúsculas y minúsculas "document.cookie" | "setcookie"fiesta - encontrar el archivo que contiene el texto

¿Cómo iba a hacer eso?

+4

¿Ha considerado usar grep? http://www.cyberciti.biz/faq/grep-in-bash/ – Terrance

Respuesta

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

Si lo que desea es añadir los nombres de archivo de la bandera de l (L minúscula):

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

El segundo ejemplo es perfecto, y me gusta su brevedad. – Owen

+0

que no parecía funcionar para mí (al menos no en mac) .... simplemente se cuelga ... egrep -lir --include = * "repo" egrep: advertencia: búsqueda recursiva de stdin –

+10

Has olvidado agregue la ruta para buscar. El camino es '.' en el ejemplo anterior. En su caso, el script está esperando la entrada para buscar en stdin. Pruebe: egrep -lir --include = * "repo"/(o cualquier otra ruta) – LodeRunner

6

suena como un trabajo perfecto para grep o tal vez ack

O esta maravillosa construcción:

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

+1 Usar '-exec grep ...' es mejor que mi método 'xargs' porque no ahogará los espacios en los nombres de archivos. –

31

Pruebe algo como grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

la -i hace caso insensitlve

la "." al final significa que quiere comenzar desde su directorio actual, esto podría ser sustituido con cualquier directorio.

los medios "-R" hacer esto de forma recursiva, hasta el árbol de directorios

la "-n" imprime el número de línea para los partidos.

"--include" le permite agregar nombres de archivo, extensiones. Comodines aceptadas

Para más información ver: http://www.gnu.org/software/grep/

+4

O tal vez use la opción '-l' (solo imprima nombres de archivo que coincidan) en lugar de' -n' –

+0

@glenn jackman buen punto – Raoul

12

find ellos y grep para la cadena:

Esto encontrará todos los archivos de los 3 tipos de/partida/ruta y grep para la expresión regular '(document\.cookie|setcookie)'. Dividido en 2 líneas con la barra invertida simplemente para facilitar la lectura ...

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

Me gusta el uso universal de find, pero en mi opinión es mejor usar '-exec grep -l ' sth '{} \; ' – NGix

+0

Gracias @Michael Berkowski Esta manera más rápido más de 5 u 8 veces' # egrep -ir --include = file.foo "(foo | bar)"/dir' en ~ 500Gb directorio de peso. – Qh0stM4N

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

Sólo para incluya una alternativa más, también puede usar esto:

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

Dónde:

  • -regextype posix-extended dice find qué tipo de expresiones regulares a esperar
  • -regex "^.*\.(php|html|js)$" dice find la propia expresiones regulares nombres de archivo deben coincidir
  • -exec grep -EH '(document\.cookie|setcookie)' {} \; dice find para ejecutar el comando (con sus opciones y argumentos) especificada entre la opción -exec y \; para cada archivo que encuentre, donde {} representa dónde va la ruta del archivo en este comando.

    mientras

    opción
    • E dice grep utilizar expresiones regulares extendida (para apoyar los paréntesis) y ...
    • H opción le dice grep para imprimir las rutas de archivos antes de los partidos.

Y, teniendo en cuenta esto, si solo deseas rutas de archivos, puede utilizar:

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

Dónde

  • | [tubería] enviar la salida de find al siguiente comando después de esto (que es sed, luego sort)
  • r opción dice sed para utilizar expresiones regulares extendidas.
  • s/HI/BYE/ dice sed reemplazar cada aparición por primera vez (por línea) de "HI" con "BYE" y ...
  • s/(^.*):.*$/\1/ dice que para reemplazar la expresión regular (^.*):.*$ (es decir, un grupo [cosas encerrado por ()] incluyendo todo [.* = uno o más de cualquier caracteres] de el principio de la línea [^] hasta 'el primero ':' seguido por nada hasta' el fin de línea [$]) por el primer grupo [\1] de la regex reemplazada.
  • u dice ordenar para eliminar entradas duplicadas (tome sort -u como opcional).

... LEJOS de ser la manera más elegante. Como dije, mi intención es aumentar el rango de posibilidades (y también dar explicaciones más completas sobre algunas herramientas que podrías usar).

Cuestiones relacionadas