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