Your personal files are on your *nix-based fileserver. Using a network filesystem, you mount the server shares on your personal computer, a Linux desktop. You want to be able to quickly find files on the server.
Actually, you also have a laptop and a few other PCs. On all those machines, you want instant search results for filename queries on the server. You only want to do indexing on your server because your other machines are often switched off and besides, indexing could be slow over the network and why should all those machines do redundant work?
mlocate, we run a cronjob on the server to do a regular
updatedb process. We make sure that the base directory path for both server and clients is the same, using bind mounts. The
updatedb database file will be stored in a location that is accessible for the clients.
The clients will copy the database file. An environment variable
LOCATE_PATH will be added on the clients using their
.profile configuration file, so that the additional
locate database file will be used.
On the client, you can use a regular
locate command, or use frondends such as
catfish or other tools, e.g. feeding the results in
On the Server
If the directory paths on your server differ from the mount paths on your clients, then you have to add bind mounts in
/data/share1 /mnt/share1 none bind /data/share2 /mnt/share2 none bind /data/share3 /mnt/share2 none bind
Create a shellscript, e.g.
updatedb_mounts.sh, which is responsible for the creation of database files. For each path or mountpoint, initially do e.g.
touch /mnt/share1/mlocate.db and make sure it has the correct file permissions. Note that the directory paths of these mountpoints should be identical to the mountpoints on the clients.
#!/bin/sh # create a mlocate database for a specific location MOUNTS="/mnt/share1 /mnt/share2 /mnt/share3" for MOUNT in $MOUNTS do if ! [[ -f $MOUNT/mlocate.db ]] then echo "Couldn't updatedb $MOUNT, is it mounted?" exit 1 fi updatedb -l 0 -o $MOUNT/mlocate.db -U $BASEDIR done
Store this file in e.g.
/usr/local/bin and make it executable using
Finally, we have to make sure this script is executed on a regular basis. You can do so by editing
/etc/crontab, making a systemd timer, or whatever. If the shared files don’t change that often, a daily run will do:
ln -s /usr/local/bin/updatedb_mounts.sh /etc/cron.daily/updatedbmounts
On the Client
If your local network mountpoint differs from the server mountpoint, then follow the same bind mount trick as being explained for the server. For now, let’s assume the mountpoints have the same path.
You can use the mlocate database files from the server directly, although I would only recommend this for a Local Area Network (LAN).
~/.profile settings and add a
LOCATE_PATH environment variable. The full filepaths to the mlocate database files should be separated by a colon (
Logoff, login again, and you’re set to go. Just use
locate (r catfish or
locate_and_select.sh (see below) or whatever tool you like to search for your files on the server.
local copy of database
Another approach for even faster search is to regularly copy the mlocate database files to a local directory and use that local copy in your
LOCATE_PATH environment variable. This is easy to implement; just a cronjob and a regular file copy operation suffice. Make sure your local copy doesn’t stay behind the version stored on the server.
Locate and Select
If you only want to use
locate than the catfish utility can be slow. Feeding the results of locate to fzf or rofi and using the selection to automatically open a (GUI) file manager is another approach that can work very well. You might be interested in my own script, Locate and Select.