Mais duas alternativas:
com awk
awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*
ou se a sua versão awk não suporta nextfile (graças à sugestão de Stéphane Chazelas):
awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*
irá ler apenas a primeira linha antes de mudar para o próximo arquivo, e imprimi-lo apenas se corresponder a "pattern" .
As vantagens são que é possível ajustar o campo no qual pesquisar o padrão (usando, por exemplo, $2 para pesquisar apenas no segundo campo) e a saída (por exemplo, $3 para imprimir o terceiro campo ou FILENAME , ou até mixar.
Observe que com a versão FNR (número do registro de entrada atual, ou seja, o número da linha) você pode ajustar mais a (s) linha (s) na qual deseja grep: FNR==3 para a terceira linha, FNR<10 para as 10 primeiras linhas, etc. (Eu acho que, neste caso, se você está lidando com arquivos muito grandes e sua versão awk suporta, você pode querer misturar FNR com nextfile para melhorar o desempenho).
Com head , mantendo nomes de arquivo
head -n1 -v mydir/files*|grep -B1 pattern
A opção
-v de head imprimirá nomes de arquivos, e a opção -B1 de grep imprimirá a linha anterior de linhas correspondentes - ou seja, os nomes dos arquivos. Se você precisa apenas dos nomes dos arquivos, você pode canalizá-lo ainda mais para grep :
head -n1 -v mydir/*|grep -B1 pattern|grep ==>
Como notado por don_crissti nos comentários, tenha cuidado com os nomes de arquivos que correspondem ao padrão, embora…