find . ! -name . -prune -mtime 1 -name 'fileprefix*' \
-exec sed -se'/searchstring/h;$!d;x' {} +
... funcionará si tiene GNU sed
que admite la -s
opción de archivos separados y un POSIX find
.
Probablemente debería agregar los ! -type d
o -type f
calificadores, 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: sed
sobrescribe su h
antiguo espacio con una copia de cualquier línea de entrada que coincida searchstring
, luego d
elige de la salida todas las líneas de entrada, pero la última para cada archivo de entrada. Cuando llega a la última línea, x
cambia sus espacios de retención y de patrón, por lo que si searchstring
se 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 /./!d
a la cola de la sed
secuencia de comandos si eso no es deseable) .
Esto hará una sola sed
invocación por cada 65k archivos de entrada, o sea cual sea su ARG_MAX
lí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 F
comando, o bien puede imprimirlos find
en una lista separada por lote agregando el -print
primario después +
.