En bash, quiero devolver el nombre del archivo (y la ruta al archivo) para cada archivo de tipo que .php|.html|.jscontiene la cadena que no distingue entre mayúsculas y minúsculas"document.cookie" | "setcookie"
eso no pareció funcionar para mí (al menos no en Mac) ... simplemente se cuelga ... egrep -lir --include = * "repo" egrep: advertencia: búsqueda recursiva de stdin
Dean Hiller
13
Olvidó agregar la ruta de búsqueda. El camino es '.' en el ejemplo anterior En su caso, el script está esperando que la entrada busque en stdin. Pruebe: egrep -lir --include = * "repo" / (o cualquier otra ruta)
LodeRunner
1
grep -E ... >egrep ...
Aman
Tengo un error grep: (error|fail): No such file or directoryen Ubuntu Desktop 16; alguna pista?
Nam G VU
Para que esto funcione, tuve que omitir * con \. así que tengo--include=\*.{php,html,js}
O tal vez use la -lopción (simplemente imprima los nombres de archivo que coincidan) en lugar de-n
glenn jackman
15
findellos y greppara 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 ...
El uso de +1 -exec grep...es mejor que mi xargsmétodo porque no se ahogará con espacios en los nombres de archivo.
Michael Berkowski
@MichaelBerkowski: Se puede utilizar de esta manera para hacer frente a los espacios en blanco 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.
-regextype posix-extendeddice findqué tipo de expresiones regulares esperar
-regex "^.*\.(php|html|js)$"le dice a findla expresión regular que los nombres de archivo deben coincidir
-exec grep -EH '(document\.cookie|setcookie)' {} \;le indica findque ejecute el comando (con sus opciones y argumentos) especificado entre la -execopció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 ...
Hla opción le dice grepque imprima las rutas de los archivos antes de las coincidencias.
Y, dado esto, si solo desea rutas de archivos, puede usar:
|[pipe] envía la salida del findsiguiente comando después de esto (que es sed, entonces sort)
rLa opción le dice sedque use expresiones regulares extendidas.
s/HI/BYE/le dice sedque 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.
ule dice a sort que elimine las entradas duplicadas (tome sort -ucomo 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).
Respuestas:
La
r
bandera significa buscar de forma recursiva (buscar subdirectorios). Lai
bandera significa mayúsculas y minúsculas.Si solo desea nombres de archivo, agregue la bandera
l
(minúsculaL
):fuente
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úsculasel
.
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 directoriosla
-n
imprime el número de línea para los partidos.le
--include
permite agregar nombres de archivo, extensiones. Se aceptan comodinesPara obtener más información, consulte: http://www.gnu.org/software/grep/
fuente
-l
opción (simplemente imprima los nombres de archivo que coincidan) en lugar de-n
find
ellos ygrep
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 ...fuente
-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 ackO esta maravillosa construcción:
fuente
-exec grep...
es mejor que mixargs
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.fuente
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
dicefind
qué tipo de expresiones regulares esperar-regex "^.*\.(php|html|js)$"
le dice afind
la expresión regular que los nombres de archivo deben coincidir-exec grep -EH '(document\.cookie|setcookie)' {} \;
le indicafind
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 dicegrep
que use expresiones regulares extendidas (para admitir los paréntesis) y ...H
la opción le dicegrep
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 delfind
siguiente comando después de esto (que essed
, entoncessort
)r
La opción le dicesed
que use expresiones regulares extendidas.s/HI/BYE/
le dicesed
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 (tomesort -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).
fuente