#!/bin/bash # mkslocatedb--Builds the central, public locate database as user nobody, # and simultaneously steps through each user's home directory to find # those that contain an .slocatedb file. If found, an additional, private # version of the locate database will be created for that user. locatedb="/var/locate.db" slocatedb=".slocatedb" if [ "$(id -nu)" != "root" ] ; then echo "$0: Error: You must be root to run this command." >&2 exit 1 fi if [ "$(grep '^nobody:' /etc/passwd)" = "" ] ; then echo "$0: Error: you must have an account for user 'nobody'" >&2 echo "to create the default slocate database." >&2; exit 1 fi cd / # sidestep post-su pwd permission problems # First, create or update the public database su -fm nobody -c "find / -print" > $locatedb 2>/dev/null echo "building default slocate database (user = nobody)" echo ... result is $(wc -l < $locatedb) lines long. # Now step through the user accounts on the system to see who has # a $slocatedb file in their home directory. for account in $(cut -d: -f1 /etc/passwd) do homedir="$(grep "^${account}:" /etc/passwd | cut -d: -f6)" if [ "$homedir" = "/" ] ; then continue # refuse to build one for root dir elif [ -e $homedir/$slocatedb ] ; then echo "building slocate database for user $account" su -m $account -c "find / -print" > $homedir/$slocatedb \ 2>/dev/null chmod 600 $homedir/$slocatedb chown $account $homedir/$slocatedb echo ... result is $(wc -l < $homedir/$slocatedb) lines long. fi done exit 0