Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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}\$"
share|improve this question
up vote 3 down vote accepted

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$
share|improve this answer

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

locate -r '/log$'
share|improve this answer
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 '10 at 4:25
I knew there must be a better way! – misterben Nov 28 '10 at 12:32

Have you tried:

locate /home/insertusernamehere/*/filename?


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

or any variation of such?

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

Here it is

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

locatedir $*
share|improve this answer
If you can explain what changes you have made it will be helpful for other too. – Ron Jun 12 '15 at 13:15

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.