Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Emulating 'locate'



    Hi Lloyd :)

 * Lloyd Zusman <ljz@xxxxxxxxxx> dixit:
> >>     locate() { print -l /**/*${^*}*{,/**/*} }
> >     Ok, it works like a charm... Thanks a lot, as always :)
> I might have missed something about this in the first part of the thread
> a couple weeks ago (those messages have already expired on my system),
> but in case it wasn't mentioned before, I want to point out that this
> function is _extremely_ slow in comparison to the standard 'locate'
> command.  It traverses through every accessible item on every accessible
> file system in order to check for a match.  On my server, it's literally
> thousands of times slower than using the standard 'locate'.

    Obviously: locate uses a database of names for doing the
'location'. Moreover, I don't know exactly if locate is faster than
doing a grep in the same database (uncompressed, of course... The
locate database is front-compressed, see find manual for details).

    The 'locate' command doesn't do any magic for being fast: the
price it pays is the need of a database, that may be outdated (so you
will miss files, or find nonexistent ones...). If you want reliable
results you have two options:

    - Use the zsh version, or a version with 'find'.
    - Update de database regularly. Very regularly, in fact. If files
are created and destroyed frequently, you will have to update the
database continously... On the average system, anyway, this is not an
issue, specially if you look for files that reside on 'stable' parts
of the system.
 
> I'm not sure how it compares to this:
>   locate() { find / -name "*${^*}*" -print }

    This is faster, IMHO, because AFAIK find uses a non-recursive
algorithm to recurse the hierarchy. Although I'm not sure about that
glob pattern you use, since it will be interpreted by find, not the
shell :?? The manual says you can use a shell pattern, but I'm not
sure about who interprets it. If it is find who interprets, then
${^*} won't work as expected. Using more ellaborate patterns is an
advantage of using the zsh version.

> Figuring this out is a very good learning experience for zsh. 
> However, I would not recommend installing this function for
> everyday use on a reasonably sized system.

    Of course ;))) But on small systems or when searching on a
limited set of directories, the zsh version, although slower, permits
more ellaborated searches, IMHO. And doesn't find false positives
(nonexistent files) nor misses files ;) But you're true, this is more
a learning experience than a function of real use. For it to be
useful, it must be rewritten to use a database, or something like
that...

    Raúl Núñez de Arenas Coronado

-- 
Linux Registered User 88736
http://www.pleyades.net & http://raul.pleyades.net/



Messages sorted by: Reverse Date, Date, Thread, Author