find . ! -name . -prune -mtime 1 -name 'fileprefix*' \
-exec sed -se'/searchstring/h;$!d;x' {} +
... funcionará se você tiver o GNU sed
que suporta a -s
opção eparate files e um POSIX find
.
Você provavelmente deve adicionar os ! -type d
ou -type f
qualificadores, 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 - sed
sobrescreve seu h
espaço antigo com uma cópia de qualquer linha de entrada que corresponda searchstring
e d
elimina da saída todas as linhas de entrada, exceto a última para cada arquivo de entrada. Quando chega à última linha, ele x
altera seus espaços de espera e padrão e, portanto, se searchstring
foi 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 /./!d
ao final do sed
script, se isso for indesejável) .
Isso fará uma única sed
chamada por alguns arquivos de entrada de 65k - ou qualquer que seja o seu ARG_MAX
limite. 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, sed
você pode escrevê-los em linhas separadas com o F
comando, ou pode imprimi-los find
em uma lista separada por lote, acrescentando o -print
primário depois +
.