Gostaria de passar isso por meio de um segundo grep para removê-los:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
O -v inverte a correspondência, imprimindo linhas que não correspondem ao padrão e a -P ativa as Expressões regulares compatíveis com Perl, que permitem usar look-behind negativo . Essa regex específica corresponderá a .js , que não é precedida por debug , o que significa que, como estamos invertendo as correspondências, somente os arquivos .js serão impressos.
No entanto, como @QuestionOverflow apontou para os comentários, isso pode ter o efeito colateral indesejado de filtrar linhas que contêm OK e js , pois o grep -v é aplicado ao Toda a saída, não apenas o nome do arquivo. Para evitar isso, basta adicionar dois pontos (é isso que o grep usa para separar nomes de arquivo do conteúdo do arquivo):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Isso ainda falhará se a linha de entrada contiver foo.js: ou se o nome do arquivo contiver : . Então, com certeza, use uma abordagem diferente:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
O -T faz com que grep imprima uma tabulação entre o nome do arquivo e o conteúdo do arquivo. Então, se nós simplesmente adicionarmos um \t ao final da regex, ele só será compatível com os nomes dos arquivos, e não com o conteúdo da linha.
Mesmo assim, usando find pode fazer mais sentido, independentemente disso.