288

If I want to use the locate command on a Linux machine, I usually run sudo updatedb first to update the database. I can run the locate command on OS X 10.5 but I can't find updatedb. What's the corresponding updatedb for the mac?

5
  • Well upatedb and locate are nice things but they require to run updatedb regularly (either updatedb runs regularly and this slows down your system at inconvenient times, or locate shows references to files which are not there anymore). So I think that instead of setting up locate/updatedb it would perhaps be better to get familiar with (the far more powerful) find.
    – amo-ej1
    Feb 16, 2010 at 16:43
  • 16
    While find is useful for lots of things, it does need to go through the filesystem each time. If you can narrow down the places where you are looking, that's fine. The advantage of locate is that keeps its own database, and so doesn't need to search each time. This is especially important with large and/or remote filesystems. I think that each has its place.
    – KeithB
    Feb 16, 2010 at 17:00
  • 4
    When first running locate on an OS X box it tells you to run sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist.
    – viam0Zah
    Feb 17, 2010 at 15:24
  • 19
    Depending on what you need to use locate for, you might find it more convenient to use the command line interface to Spotlight, mdfind, since the Spotlight database is nearly always up-to-date, and offers a lot more functionality than locate. man mdfind
    – Paul R
    Feb 17, 2010 at 16:09
  • 1
    The answer to this question is found in man locate :) The answer has been in man locate since at least August 17, 2006.
    – Seamus
    Jun 26, 2022 at 19:06

5 Answers 5

387

It's locate.updatedb on Mac.

sudo /usr/libexec/locate.updatedb

For more information see the locate.updatedb man page.

9
  • 10
    That man page also claims: It is typically run once a week by the /System/Library/LaunchDaemons/com.apple.locate.plist job. (And man locate tells one about that script: /usr/libexec/locate.updatedb Script to update the locate database)
    – Arjan
    Feb 16, 2010 at 15:29
  • 5
    @Arjan : It should be run once a week, but the default it's disabled and the time when it should be done is 3am on Sundays (or something similar), which isn't really useful :)
    – Studer
    Feb 16, 2010 at 15:36
  • On linux I usually run sudo ionice -c3 updatedb which tells updatedb to share the i/o controller nicely (io nice) but I don't think this command is available on mac. I also miss having the -r regular expression flag which can be used with the GNU locate, although I'm not sure I want to use homebrew and install the GNU locate mentioned by @Grogs
    – cwd
    Jun 16, 2012 at 12:41
  • 3
    Example macosx alternative to "locate (-r)" and "updatedb" that uses spotlight ("-i" optional of course): mdfind -name "mp4" | egrep -i "^/Users.*Downloads/.*Stuff"
    – michael
    Jan 30, 2013 at 19:35
  • 1
    Also, if you don't find files which you expect to, note this relevant caveat from the the BUGS section of the manpage: The locate database is typically built by user ''nobody'' and the locate.updatedb(8) utility skips directories which are not readable for user ''nobody'', group ''nobody'', or world. For example, if your HOME directory is not world-readable, none of your files are in the database Dec 9, 2015 at 13:18
105

You can do sudo ln -s /usr/libexec/locate.updatedb /usr/local/bin/updatedb to make the updatedb command available.

2
  • Heh, I just posted this as a comment.. Then saw you said this. I think this is a nice little mod to make. :) Jul 2, 2015 at 16:51
  • 8
    or alias it in your .bash_profile Aug 9, 2016 at 17:26
23

Personally, I just installed findutils (use MacPorts or Homebrew).

Then you have GNU locate and updatedb.

updatedb won't work without sudo.

Personally I prefer to have a per user locatedb though; if you sudo other users will know the names/locations of all your files.

I have a cron job to run:

updatedb --localpaths='/Users/grogs' --output='/Users/grogs/tmp/locatedb'

And in my .zshrc .bashrc/.bashprofile:

export LOCATE_PATH="~/tmp/locatedb"

3
  • 3
    Brew-installing findutils on OS X Mavericks gave me a gupdatedb command, not an updatedb one. Unfortunately this command gave me an error described here (where your SO answer is referenced). Ultimately I've aliased updatedb to LC_ALL=’C’ sudo updatedb as a workaround, but I don't know if this is a long-term solution. Dec 13, 2013 at 19:18
  • 3
    Add /opt/local/libexec/gnubin at the start of your path, if you want the coreutils and findutils installed by macports to be available with their original names (and not their g-prefixed versions).
    – 0 _
    Sep 18, 2014 at 22:01
  • I've recently installed the Linux version of locate from MacPorts. Unfortunately, the updatedb port is broken, which of course renders the newer Linux version of locate as useless.
    – Seamus
    Jun 26, 2022 at 18:42
5

If you run locate without first updating the database, you have a chance to see the OS's recommended way by its output.

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once 
the database has been created, this message will no longer appear.
0

Actually you can use the GNU locate & update in mac too.

brew install findutils --with-default-names

export PATH="$(brew --prefix findutils)/libexec/gnubin:$PATH"
export MANPATH="$(brew --prefix findutils)/libexec/gnuman:$MANPATH"

which locate
1
  • or to avoid the name collision with the macos ootb locate install without the --with-default-names switch and then invoke via glocate
    – ccpizza
    Feb 15 at 12:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .