find . ! -name . -prune -mtime 1 -name 'fileprefix*' \
-exec sed -se'/searchstring/h;$!d;x' {} +
... funcionará si tiene GNU sedque admite la -sopción de archivos separados y un POSIX find.
Probablemente debería agregar los ! -type do -type fcalificadores, sin embargo, porque tratar de leer un directorio No será muy útil, y estrechando aún más la gama de archivos normales podría evitar un colgante de lectura en una tubería o un archivo de dispositivo serie.
La lógica es increíblemente simple: sedsobrescribe su hantiguo espacio con una copia de cualquier línea de entrada que coincida searchstring, luego delige de la salida todas las líneas de entrada, pero la última para cada archivo de entrada. Cuando llega a la última línea, xcambia sus espacios de retención y de patrón, por lo que si searchstringse encuentra en absoluto mientras lee el archivo, la última aparición de este tipo se imprimirá automáticamente en la salida, de lo contrario, escribirá una línea en blanco. (agregue /./!da la cola de la sedsecuencia de comandos si eso no es deseable) .
Esto hará una sola sedinvocación por cada 65k archivos de entrada, o sea cual sea su ARG_MAXlímite. Esta debería ser una solución muy eficaz, y se implementa de manera bastante simple.
Si también desea los nombres de archivo, dado un GNU reciente sed, puede escribirlos en líneas separadas con el Fcomando, o bien puede imprimirlos finden una lista separada por lote agregando el -printprimario después +.