Simplemente pasaría eso por un segundo greppara eliminarlos:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
El -vinvierte el partido, la impresión de líneas que no coinciden con el patrón y la -Ppermite a Perl Compatible Regular Expressions, que dejaron usar lookbehinds negativos . Esta expresión regular particular coincidirá con lo .jsque no está precedido por debugel medio (ya que estamos invirtiendo las coincidencias) de que solo .jsse imprimirán esos archivos.
Sin embargo, como @QuestionOverflow señaló en los comentarios, eso podría tener el efecto secundario no deseado de filtrar las líneas que contienen OKy jsdado que grep -vse aplica a toda la salida, no solo al nombre del archivo. Para evitar eso, solo agregue dos puntos (eso es lo que se grepusa para separar los nombres de archivo del contenido del archivo):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Eso seguirá fallando si su línea de entrada contiene foo.js:o si su nombre de archivo contiene :. Entonces, para estar seguro, use un enfoque diferente:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
Las -Tcausas greppara imprimir una pestaña entre el nombre del archivo y el contenido del archivo. Entonces, si simplemente agregamos un \tal final de la expresión regular, solo coincidirá con los nombres de los archivos, y no con el contenido de la línea.
Aún así, el usofind podría tener más sentido independientemente.
OKy.jsen la misma línea?findes probablemente mejor para este tipo de cosas. Conseguir lo correctogreppuede ser complicado como lo señaló :).failglobopción establecida en el shell:bash: no match: --exclude=*~debe citar sus argumentos de patrón GLOB--excludepara ocultarlos de la expansión del shell, por ejemplo--exclude={\*~,\*.map}Lo usaría
findpara ubicar los archivos y canalizar el resultado a través dexargs:Esto busca todos los archivos que no coinciden con "
*~", "*.map" o "*.jspero no*.debug.js".El uso
findpuede buscar fácilmente reglas bastante complejas y este enfoque le evita eliminar accidentalmente los falsos positivos, como podría suceder con el doblegrep.fuente
-exec grep OK {} +lugar dexargsy evitar un programa adicional.-exec +no-exec \;, que ejecutará la menor cantidad de comandos posible, al igual quexargs.Con
zshusted puede hacer:Siempre que, por supuesto, la lista de argumentos no sea demasiado larga, en cuyo caso siempre puede hacer:
fuente
zsh:autoload zargsyzargs some/dir/**/^(*~|*.map|(^*debug).js) -- grep OKSi no le importa ver el resultado un poco fuera de servicio (si lo hace, puede ordenarlo):
Esto requiere que su shell sea compatible
**con el globbing recursivo: zsh lo hace fuera de la caja, bash lo hace después de corrershopt -s globstar, ksh93 lo hace después de correrset -o globstar.Sin
**soporte en el shell, puede usar dos comandos grep:fuente
**, pero parece haber algo mal con el argumento adicional**/*.debug.js, lo que hace que grep se interpreteOKcomo un directorio. ¿Has intentado ejecutarlo?Puedes usar
ripgrep. Por defecto, ignora los archivos ocultos y respeta su.gitignorearchivo.Puede especificar las reglas de inclusión o exclusión utilizando los siguientes parámetros:
Aquí hay algunos ejemplos simples:
Aquí está la solución completa para excluir
*.~,*.map,*.js, pero no*.debug.js:Pruebas:
fuente