Como o status de saída de grep
indica se ele encontrou ou não uma correspondência, você deve ser capaz de testá-lo diretamente como um predicado find
(com a negação necessária, !
ou -not
), por exemplo
find . -type f -name "*.c" \( -exec grep -q "ABC" {} \; ! -exec grep -q "123" {} \; \) -print
-q
faz grep
sair silenciosamente na primeira correspondência - não precisamos ouvi-la porque deixamos find
imprimir o nome do arquivo.