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 Answers
It's locate.updatedb
on Mac.
sudo /usr/libexec/locate.updatedb
For more information see the locate.updatedb man page.
-
10That
man
page also claims: It is typically run once a week by the /System/Library/LaunchDaemons/com.apple.locate.plist job. (Andman locate
tells one about that script: /usr/libexec/locate.updatedb Script to update the locate database)– ArjanFeb 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 :)– StuderFeb 16, 2010 at 15:36
-
On linux I usually run
sudo ionice -c3 updatedb
which tellsupdatedb
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– cwdJun 16, 2012 at 12:41 -
3Example macosx alternative to "locate (-r)" and "updatedb" that uses spotlight ("-i" optional of course): mdfind -name "mp4" | egrep -i "^/Users.*Downloads/.*Stuff"– michaelJan 30, 2013 at 19:35
-
1Also, 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
You can do sudo ln -s /usr/libexec/locate.updatedb /usr/local/bin/updatedb
to make the updatedb
command available.
-
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
-
7
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"
-
3Brew-installing findutils on OS X Mavericks gave me a
gupdatedb
command, not anupdatedb
one. Unfortunately this command gave me an error described here (where your SO answer is referenced). Ultimately I've aliasedupdatedb
toLC_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 -
3Add
/opt/local/libexec/gnubin
at the start of your path, if you want thecoreutils
andfindutils
installed bymacports
to be available with their original names (and not theirg
-prefixed versions).– 0 _Sep 18, 2014 at 22:01 -
I've recently installed the Linux version of
locate
from MacPorts. Unfortunately, theupdatedb
port is broken, which of course renders the newer Linux version oflocate
as useless.– SeamusJun 26, 2022 at 18:42
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
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
locate
on an OS X box it tells you to runsudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
.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
man locate
:) The answer has been inman locate
since at least August 17, 2006.