find . ! -name . -prune -mtime 1 -name 'fileprefix*' \
-exec sed -se'/searchstring/h;$!d;x' {} +
... будет работать, если у вас есть GNU, sedкоторый поддерживает -sопцию eparate files и POSIX find.
Вы, вероятно, должны добавить квалификаторы ! -type dили -type f, хотя, потому что попытка чтения каталога не будет очень полезной, и дальнейшее сужение диапазона до обычных файлов может избежать зависания чтения в канальном или последовательном файле устройства.
Логика невероятно проста - sedперезаписывает свое hстарое пространство копией любой входной строки, которая совпадает searchstring, а затем dотключает все выходные строки, кроме последней, для каждого входного файла. Когда он добирается до последней строки, он xменяет свое пространство удержания и шаблонные пространства, и поэтому, если он вообще searchstringбыл найден во время чтения файла, последнее такое вхождение будет автоматически напечатано для вывода, в противном случае он записывает пустую строку. (добавьте /./!dв конец sedскрипта, если это нежелательно) .
Это будет делать один sedвызов для некоторых входных файлов 65k - или независимо от вашего ARG_MAXпредела. Это должно быть очень эффективным решением, и оно довольно просто реализуется.
Если вам также нужны имена файлов, учитывая недавний GNU, sedвы можете записать их в отдельные строки с помощью Fкоманды, или вы можете распечатать их findв отдельном списке для пакета, добавив -printосновной после +.