And adding a combination of caching and
Linux::Inotify2 would let you get a nice additional speed gain (plus let you know when to invalidate the cache), assuming repeated searches for the same string are going to be happening. You might even be able to quickly re-prime the cache if the underlying files change infrequently by hanging onto the N most-commonly-repeated searches, redoing these, and then reloading them into the cache in the background.