En bash, quiero devolver el nombre del archivo (y la ruta al archivo) para cada archivo de tipo que .php|.html|.js
contiene la cadena que no distingue entre mayúsculas y minúsculas"document.cookie" | "setcookie"
¿Como podría hacerlo?
En bash, quiero devolver el nombre del archivo (y la ruta al archivo) para cada archivo de tipo que .php|.html|.js
contiene la cadena que no distingue entre mayúsculas y minúsculas"document.cookie" | "setcookie"
¿Como podría hacerlo?
Respuestas:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
La r
bandera significa buscar de forma recursiva (buscar subdirectorios). La i
bandera significa mayúsculas y minúsculas.
Si solo desea nombres de archivo, agregue la bandera l
(minúscula L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
en Ubuntu Desktop 16; alguna pista?
--include=\*.{php,html,js}
Intenta algo como grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
lo -i
hace insensible a las mayúsculas y minúsculas
el .
en los medios del grupo que desea iniciar desde el directorio actual, esto podría ser sustituido con cualquier directorio.
los -r
medios hacen esto de forma recursiva, directamente en el árbol de directorios
la -n
imprime el número de línea para los partidos.
le --include
permite agregar nombres de archivo, extensiones. Se aceptan comodines
Para obtener más información, consulte: http://www.gnu.org/software/grep/
-l
opción (simplemente imprima los nombres de archivo que coincidan) en lugar de-n
find
ellos y grep
para la cuerda:
Esto encontrará todos los archivos de sus 3 tipos en / starting / path y grep para la expresión regular '(document\.cookie|setcookie)'
. Dividir en 2 líneas con la barra invertida solo para facilitar la lectura ...
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
en ~ 500Gb directorio de peso.
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 {} \;
-exec grep...
es mejor que mi xargs
método porque no se ahogará con espacios en los nombres de archivo.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Por supuesto, también se pueden agregar las otras opciones.
Solo para incluir una alternativa más, también puedes 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 esperar-regex "^.*\.(php|html|js)$"
le dice a find
la expresión regular que los nombres de archivo deben coincidir-exec grep -EH '(document\.cookie|setcookie)' {} \;
le indica find
que ejecute el comando (con sus opciones y argumentos) especificado entre la -exec
opción y el \;
archivo para cada archivo que encuentre, donde {}
representa dónde va la ruta del archivo en este comando.
mientras
E
la opción dice grep
que use expresiones regulares extendidas (para admitir los paréntesis) y ...H
la opción le dice grep
que imprima las rutas de los archivos antes de las coincidencias.Y, dado esto, si solo desea rutas de archivos, puede usar:
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
|
[pipe] envía la salida del find
siguiente comando después de esto (que es sed
, entonces sort
)r
La opción le dice sed
que use expresiones regulares extendidas.s/HI/BYE/
le dice sed
que reemplace cada Primera aparición (por línea) de "HI" con "BYE" y ...s/(^.*):.*$/\1/
le dice que reemplace la expresión regular (^.*):.*$
(es decir, un grupo [cosas encerradas por ()
] incluyendo todo [ .*
= uno o más de cualquier carácter] desde el comienzo de la línea [ ^
] hasta 'el primero': 'seguido de cualquier cosa hasta' el final de línea [ $
]) por el primer grupo [\1
] de la expresión regular reemplazada.u
le dice a sort que elimine las entradas duplicadas (tome sort -u
como opcional).... LEJOS de ser la forma 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ía usar).