I use locate all the time to find files that I know the name of, locate is very fast and I love that. For recently created files find is great, normally with recently created files I know where basically they were created so I don't have to search my entire file system.

When I've forgotten the location of a directory however neither find nor locate seem ideal.

Locate always spits out far too much information because every file within a directory is also a match for locate. For instance if I was searching for a directory named log somewhere on my file system locate log would return tons and tons of results. If I do the same thing with find, find / -name log -type d find takes minutes to run and spits out all sorts of permissions errors every time it encounters a folder it can't read.

Is there a better way?

Answer: So I'm sticking with grep until I find something else:

locatedir () {
    for last; do true; done
    if [[ $last == *\/* ]]
        locate $@ | grep "${last}\$"
        locate $@ | grep "/${last}\$"

4 Answers 4


You can use the option --regex (-r) of locate:

locate -r '/log$'
  • Yes (+1). locate has its own built-in regex capablility: -r or --regex ... for full range of options see: info locate
    – Peter.O
    Nov 28, 2010 at 4:25
  • 1
    I knew there must be a better way!
    – misterben
    Nov 28, 2010 at 12:32
  • So short and it works smoothly. Great contribution! Another reason to learn/master regular expressions Nov 8, 2016 at 12:23
  • You don't need the two ' in this case: locate -r /log$ is enough.
    – simlev
    Sep 26, 2017 at 8:56

A way (I suspect there may be a better way) is to use grep to return only the those paths which end in your folder name :

locate foldername | grep /foldername$

Have you tried:

locate /home/insertusernamehere/*/filename?


locate file | grep -i '^/home/.*/examplesubdirectory'?

or any variation of such?

  • This answer shows that grep isn't necessary, and as seen in the first suggested option, neither are regexps.
    – Tom
    Apr 9, 2015 at 12:43

Here it is

locatedir () {
    locate "$*" | while read line
    if [ -d "$line" ] ; then echo $line ; fi

locatedir $*
  • 1
    If you can explain what changes you have made it will be helpful for other too.
    – Ron
    Jun 12, 2015 at 13:15

You must log in to answer this question.

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