lsgrep is just a simple tool I use to quickly find files matching a search pattern in the current directory. I just figured I’d share it because I end up using it a lot.

My primary shell is Fish, so I’ll share that one first. This version uses silver searcher (ag) to search for matches. The search uses wildcards (* for multiple characters and ? for a single character). Spaces get turned into .*? and extensions (e.g. .sh) get escaped so the period matches.

# Defined in /Users/ttscoff/.config/fish/functions/lsgrep.fish @ line 1
function lsgrep --description 'Wildcard folder/file search'
  # Convert search to regex: change .X to \.X, ? to ., and space or * to .*?
	set -l needle (echo $argv|sed -E 's/\.([a-z0-9]+)$/\\\.\1/'|sed -E 's/\?/./'| sed -E 's/[ *]/.*?/g')
	command ag --hidden --depth 3 -SUg "$needle" 2>/dev/null
end

Now I can run lsgrep in Fish like this:

$ lsgrep gist test

This will find the file gist_test.sh in any subdirectory up to 3 levels deep from the current directory.

Here’s a version in Bash (or Zsh) that uses find instead, requiring no extra tools:

#!/bin/bash

NEEDLE=".*$(echo $@|sed -E 's/\.([a-z0-9]+)$/\\\.\1/'|sed -E 's/\?/./'| sed -E 's/[ *]/.*/g').*"

find -E . -maxdepth 3 -regex $NEEDLE 2>/dev/null

Because find doesn’t allow for .*? operators in the regex, it’s a little bit broader of a search, but in 99% of cases the results are the same as the ag version.

You can obviously change the max depth in either function to a higher number if you want to search deeper in the directory tree.

Hope that’s useful!