Using Spotlight (or mdfind) from the terminal

If you’re a Mac developer, you’ve probably found yourself typing something like this quite a lot:

grep -r 'some search string' .

Grep searches the current folder (and subfolders, with -r) for a given search term. Which is awesome. But on large nested trees, it can be slow. I also have a devil of a time remembering what order the arguments go in (is it search term first, or directory first?).

Typical Mac users are accustomed to invoking Spotlight for lightning-fast searches of their hard drive. It turns out Spotlight has a command line client, called mdfind, but its arguments are just as gnarly as grep’s:

mdfind -onlyin ./ 'some search string'

So, I made a wrapper function, defined in my ~/.bash_profile that gives me a nice simple spotlight 'some search string' interface for querying the current folder, recursively, and in a flash, with Spotlight:

# in ~/.bash_profile

spotlight() {
  if [ -z "$1" ]; then
    echo "Search the current folder for files containing a text string"
    mdfind -onlyin ./ "$1";

Give it a try!

spotlight 'some search term'

It’s worth bearing in mind that, unlike grep, Spotlight does fuzzy searching. So “person” will match files containing person, person-id, personality, and idPerson (but not impersonal). Spotlight also ignores pretty much all punctuation, which can be a big gotcha when you’re searching for a PHP variable like $foobar—which will return no results—or even a hypenated string like some-variable.

In these cases, you can either second-guess Spotlight by rephrasing your search term without punctuation, or fall back to grep. And grab a cup of tea while it chugs away.