Simplemente pasaría eso por un segundo grep
para eliminarlos:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
El -v
invierte el partido, la impresión de líneas que no coinciden con el patrón y la -P
permite a Perl Compatible Regular Expressions, que dejaron usar lookbehinds negativos . Esta expresión regular particular coincidirá con lo .js
que no está precedido por debug
el medio (ya que estamos invirtiendo las coincidencias) de que solo .js
se 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 OK
y js
dado que grep -v
se aplica a toda la salida, no solo al nombre del archivo. Para evitar eso, solo agregue dos puntos (eso es lo que se grep
usa 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 -T
causas grep
para imprimir una pestaña entre el nombre del archivo y el contenido del archivo. Entonces, si simplemente agregamos un \t
al 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.
OK
y.js
en la misma línea?find
es probablemente mejor para este tipo de cosas. Conseguir lo correctogrep
puede ser complicado como lo señaló :).failglob
opción establecida en el shell:bash: no match: --exclude=*~
debe citar sus argumentos de patrón GLOB--exclude
para ocultarlos de la expansión del shell, por ejemplo--exclude={\*~,\*.map}
Lo usaría
find
para ubicar los archivos y canalizar el resultado a través dexargs
:Esto busca todos los archivos que no coinciden con "
*~
", "*.map
" o "*.js
pero no*.debug.js
".El uso
find
puede 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 dexargs
y evitar un programa adicional.-exec +
no-exec \;
, que ejecutará la menor cantidad de comandos posible, al igual quexargs
.Con
zsh
usted puede hacer:Siempre que, por supuesto, la lista de argumentos no sea demasiado larga, en cuyo caso siempre puede hacer:
fuente
zsh
:autoload zargs
yzargs some/dir/**/^(*~|*.map|(^*debug).js) -- grep OK
Si 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 interpreteOK
como un directorio. ¿Has intentado ejecutarlo?Puedes usar
ripgrep
. Por defecto, ignora los archivos ocultos y respeta su.gitignore
archivo.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