#! /bin/sh # ^^ THIS SHELL NEEDS BUILT-IN echo TO DO LOOP BELOW EFFICIENTLY. # $Header: /home/jerry/.lib/at_cron/RCS/mhlinks.build,v 1.4 92/08/09 23:32:44 jerry mh_contrib $ ### mhlinks.build - build database for 'mhlinks' program ### Usage: mhlinks.build [output file] ## ## mhlinks.build BUILDS A DATABASE FOR THE mhlinks COMMAND. ## THE DATABASE LISTS EACH MESSAGE FILE, SORTED BY I-NUMBER. ## THE DEFAULT FILENAME IS /mhlinks.list; YOU CAN CHANGE ## THAT BY GIVING A PATHNAME ON THE COMMAND LINE. ## ## THE FILE IS ACTUALLY COMPRESSED AND HAS A '.Z' AT THE END... ## BUT YOU SHOULD *NOT* ADD A .Z TO YOUR NAME. ## ## mhlinks.build ONLY LOOKS INTO THE FOLDERS IN YOUR MH MAIL DIRECTORY. ## IT WON'T LOOK INTO ANYTHING BESIDES DIRECTORIES. THAT'S BECAUSE ## THE READ-ONLY FOLDERS OR SYMLINKS MIGHT POINT TO ANOTHER FILESYSTEM, ## WHERE THE I-NUMBERS DON'T MAKE SENSE. # # NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE # # USE AT YOUR OWN RISK. SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY! # PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com colrm=/usr/ucb/colrm # DELETES COLUMNS (YOU CAN ADAPT TO USE cut -c) compress=/usr/ucb/compress # COMPRESSES FROM stdin TO stdout find=/bin/find # MUST HAVE A -ls OPERATOR lastinum= # INITIALIZE I-NUMBER OF PREVIOUS FILE mh=/usr/local/mh # WHERE MH COMMANDS LIVE mhdir="`$mh/mhpath +`" # MH MAIL DIRECTORY sort=/bin/sort outfile=${1-$mhdir/mhlinks.list}.Z > "$outfile" if [ ! -w "$outfile" ] then echo "`basename $0`: can't write to output file '$outfile'." 1>&2 exit 1 fi # GO TO MH DIRECTORY SO FOLDER NAMES WILL BE SAME AS DIRECTORY NAMES. cd $mhdir || exit 1 # GET LIST OF TOP-LEVEL DIRECTORIES WITH INNER find AND GIVE TO # OUTER find LIKE afolder bfolder inbox ETC. DO THIS TO MAKE # FILE PATHNAMES NEAT FOR INNER find. (IS THERE A BETTER WAY?) $find `$find * -prune -type d -print` -name '[1-9]*' -type f -ls | # STRIP OUT MIDDLE OF EACH LINE, LEAVE I-NUMBER AND PATHNAME: $colrm 7 65 | # SORT ASCII, NOT NUMERIC (DOES IT MATTER?): $sort | # BUILD A LINE THAT HAS ONE I-NUMBER AND ALL ITS PATHNAMES: while read inum path do case "$inum" in "$lastinum") paths="$paths $path" ;; *) # MAKE SURE THAT THERE'S A SPACE AFTER LAST PATHNAME # SO THAT ALL PATHS WILL HAVE SPACE AROUND THEM (FOR MATCHING): echo "$lastinum $paths " lastinum="$inum" paths="$path" ;; esac done | # COMPRESS AS THE DATA FLIES BY... TO SAVE SPACE: $compress > $outfile # NEED TO CHECK FOR ERRORS