find . ! -name . -prune -mtime 1 -name 'fileprefix*' \
-exec sed -se'/searchstring/h;$!d;x' {} +
... funcionará se você tiver o GNU sedque suporta a -sopção eparate files e um POSIX find.
Você provavelmente deve adicionar os ! -type dou -type fqualificadores, porque tentar ler um diretório não será muito útil, e restringir ainda mais o intervalo a arquivos regulares pode evitar uma leitura pendurada em um arquivo de pipe ou dispositivo serial.
A lógica é incrivelmente simples - sedsobrescreve seu hespaço antigo com uma cópia de qualquer linha de entrada que corresponda searchstringe delimina da saída todas as linhas de entrada, exceto a última para cada arquivo de entrada. Quando chega à última linha, ele xaltera seus espaços de espera e padrão e, portanto, se searchstringfoi encontrado durante a leitura do arquivo, a última ocorrência desse tipo será impressa automaticamente para saída, caso contrário, ele grava uma linha em branco. (adicione /./!dao final do sedscript, se isso for indesejável) .
Isso fará uma única sedchamada por alguns arquivos de entrada de 65k - ou qualquer que seja o seu ARG_MAXlimite. Essa deve ser uma solução de alto desempenho e é simplesmente implementada.
Se você também deseja os nomes de arquivos, dado um GNU recente, sedvocê pode escrevê-los em linhas separadas com o Fcomando, ou pode imprimi-los findem uma lista separada por lote, acrescentando o -printprimário depois +.