in reply to Re^4: uparse - Parse Unicode strings (locate/find/xargs)
in thread uparse - Parse Unicode strings

locate (aka mlocate, aka slocate) is a lifesaver. I used it a couple of days ago (admittedly not on a dev box) to solve a very simple problem. Some user of a client's server had been uploading files to a website from a Mac and had managed to litter the filesystem with .DS_Store files. This is a BIG filesystem we're talking about and they were not just using a small fraction of it. My task was to clean up this mess. I could have constructed a find command but coupling that with rm is always dicey especially on a production box, so the slow user would run the find twice, once to check and another to delete. The faster user would run the find once and store the output in a file, eyeball the file and then use xargs from the file to do the deletion.

The fastest user employs locate instead of find. It produced the output in under a second without hammering the disks and I was able to run it once to check the pattern:

$ locate /.DS_Store

and then again (because it's cheap) to clear the files:

$ locate /.DS_Store | xargs rm

Having eyeballed the output from the first command I could see that only the requisite files were matched and none of the paths had spaces or anything else that might trip up the pipeline.

Using it locally on my dev box is equally useful. We may have variously patched versions of code kicking around in several locations and these might require updates. Trivial to search with locate and more flexible than find because the -r option allows for regex-based matching which is so much simpler than trying to wrestle globs for complex patterns.

Occasionally I have to admin servers where the person who set them up hasn't installed locate and it doesn't take long before I'm swearing at them, installing it and running updatedb just so I can get on with my work. It's an invaluable tool and if it isn't present/available on MSWin32 then that's (yet another) black mark against that particular OS.


🦛

Replies are listed 'Best First'.
Re^6: uparse - Parse Unicode strings
by afoken (Chancellor) on Dec 02, 2023 at 12:50 UTC
    $ locate /.DS_Store

    and then again (because it's cheap) to clear the files:

    $ locate /.DS_Store | xargs rm

    find can do the same, without needing a possibly outdated database:

    find / -name .DS_Store -type f

    (-print is implicit, -type f restricts to regular files)

    And then, to avoid various traps with "funny" path names, pass found path names around ASCII-NUL separated:

    find / -name .DS_Store -type f -print0 | xargs -0 rm

    Or invoke rm directly from find:

    find / -name .DS_Store -type f -exec rm \;

    (Backslash or quotes around the semicolon are needed in bash)

    The same, but be smarter (like xargs, collect arguments instead of invoking rm for every single file):

    find / -name .DS_Store -type f -exec rm {} \+

    (Again, backslash or quotes around the plus are needed in bash)

    Or have find delete the file without forking a separate process:

    find / -name .DS_Store -type f -delete

    Optionally show what is deleted while deleting:

    find / -name .DS_Store -type f -print -delete

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

      find / -name .DS_Store -type f takes a whopping 15 minutes on my development system with mounted NAS and spams me with thousands of lines of "permission denied" lines.

      locate -r '/\.DS_store$' takes just 0.4 seconds and no error messages.

      The saved locations for locate can be cusomized (I do not want cache file in there) and should be `cron`ed to keep up to date. sudo updatedb takes a few seconds when the database is not too old.

      Same goes for find: When looking for a recent config file, I don't want it to browse my holiday pictures, the whole 6 Tb of mountes NAS storage, or old CD collection. I also use find: it is invaluable, but to find recent files quick, locate is my tool of choice.


      Enjoy, Have FUN! H.Merijn