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
основной после +
.