(Suponho que você pretendia que o segundo grep correspondesse ao conteúdo da linha e não aos nomes dos arquivos, ou ambos, conforme sua abordagem estava sendo feita)
POSIXly:
find . -type f -exec awk '
FNR == 1 {found = 0}
!found && tolower($0) ~ /some string/ && /other string/ {
print FILENAME
found = 1
nextfile
}' {} +
A empresa sobre found é para implementações awk que não suportam nextfile ainda (e onde nextfile é, então, um não operacional). Se você souber que sua implementação de awk suporta nextfile , você poderá simplificá-la para:
find . -type f -exec awk 'tolower($0) ~ /some string/ && /other string/ {
print FILENAME; nextfile}' {} +
Com o GNU grep construído com suporte a PCRE, uma vez que você deseja que uma correspondência seja insensível a maiúsculas e minúsculas e não a outra:
grep -rlP '^(?=.*(?i:some string))(?=.*other string)' .
(?=...) é um operador perl look-ahead . (?i:pattern) ativa a correspondência sem distinção entre maiúsculas e minúsculas apenas para pattern . Então, aqui estamos combinando no início da linha ( ^ ), desde que seja seguido por qualquer número de caracteres ( .* ) seguido por some string (insensível a maiúsculas) e também que ele (o início da linha) é seguido por qualquer número de caracteres e other string (diferencia maiúsculas de minúsculas).
Se o grep não der suporte a -P , você poderá ter o comando pcregrep (substitua grep -rlP por pcregrep -rl ) ou, se os padrões não se sobrepuserem, você poderá fazer:
grep -rl -e '[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG].*other string' \
-e 'other string.*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]' .
Ou se você não quer que as duas correspondências sejam insensíveis a maiúsculas e minúsculas:
grep -ril -e 'some string.*other string' \
-e 'other string.*some string' .