mesard@bbn.com (Wayne Mesard) (12/09/88)
Here's a little script I whipped up this morning. It repeatedly applies a command (with optional arguments) to a bunch of folders. I wrote it because I'm forever forgetting where I refile'd a message to the night before, and wanted a quick n dirty way to look for it. The default command and argument are "scan" and "last". The default folders are all your top-level folders. When folders are explicitly named subfolders will also be processed. The -n switch prevents this recursion. Conversly, when no folders are given, the top-level ones are used. The -r switch will cause subfolders to be processed as well. To apply a command other than "scan" use the -c switch. Examples: --------- mhall first:2 5 +unix +inbox Will "scan" the first two messages and message number 5 in +unix, +inbox and any subfolders. mhall -c show Show the current message of each top-level folder. mhall -c folder -pack -r Invoke "folder" with the -pack option on every folder and subfolder. Disclaimer: This is not elegant. ------------------SNIP------------------ #!/bin/csh -fb # mhall - apply a command to some or all of your MH folders. # Copyright (c) 1988 Wayne Mesard # # This is free software. It may be reproduced, retransmitted, # redistributed and otherwise propogated at will, provided that # this notice remains intact and in place. # # Please direct bug reports, code enhancements and comments # to mesard@BBN.COM. set tfolders set args set cmd set recurse set curfolder = `folder -fast` while ( X$1 != X ) switch ($1) case -help: echo "syntax: `basename $0` [-r] [-n] [-c command] [command-arg...] [+folder...]" exit 0 case -c: set cmd = "$2" shift breaksw case -r: set recurse = "-recurse" breaksw case -n: set recurse = "-norecurse" breaksw case +*: set tfolders = "$tfolders $1" breaksw default: set args = "$args $1" breaksw endsw shift end if ("$tfolders" == "") then set folders = `folders $recurse -fast` else set folders foreach folder ($tfolders) set folders = "$folders `folder $folder -recurse $recurse -fast`" end endif if ("$cmd" == "") then set cmd = "scan" if ("$args" == "") set args = "last" endif onintr CLEANUP foreach folder ($folders) echo :${folder}: $cmd +$folder $args end CLEANUP: folder +$curfolder >/dev/null exit 0 -------------------------SNOOP------------------- -- unsigned *Wayne_Mesard(); Vique's Law: MESARD@BBN.COM A man without religion is like a fish BBN, Cambridge, MA without a bicycle.
allbery@ncoast.UUCP (Brandon S. Allbery) (12/15/88)
As quoted from <33245@bbn.COM> by mesard@bbn.com (Wayne Mesard): +--------------- | Here's a little script I whipped up this morning. It repeatedly applies | a command (with optional arguments) to a bunch of folders. I wrote it | because I'm forever forgetting where I refile'd a message to the night | before, and wanted a quick n dirty way to look for it. +--------------- As long as we're posting our usefuls... I often save Usenet postings -- especially sources -- with rcvstore (in fact, I've defined 'S' as a macro in rn which expands to "|/u/mh/lib/rcvstore +", so I can type "Sfolder<cr>" and save something). Of course, the time comes when I want to *do* something with it. To acilitate this, I whipped together a basic shell script and use variations on it for applying commands to arbitrary messages. Included below are "muns" (MH unshar) and "mpatch" (MH patch); the former is pretty trivial, the latter does some intelligent things like extracting the "patch" command line from lwall's metaconfig-generated patches so that "-p" flags, etc. will automatically be included as needed. Also included is "muuns", an MH front-end for "uuns" (also included). "Uuns" is a perl script for unpacking multipart uuencoded postings in the format used by comp.binaries.ibm.pc. (Warning: the coding of "uuns" may seem a bit baroque, I'm still trying to make perl work correctly with ncoast's brain-damaged compiler and some things that *should* work have to be coded oddly to work around strangenesses.) ++Brandon ----------------------------------- cut here ----------------------------------- #! /bin/sh # This file was wrapped with "dummyshar". "sh" this file to extract. # Contents: muns mpatch muuns uuns echo extracting 'muns' if test -f 'muns' -a -z "$1"; then echo Not overwriting 'muns'; else sed 's/^X//' << \EOF > 'muns' Xif [ $# = 0 ]; then X echo "usage: muns [+folder] msgs [[+folder] msgs] ..." >&2 X exit 1 Xfi Xwhile [ $# -gt 0 ]; do X folder= X case "$1" in X +*) if [ $# = 1 ]; then X mhpath "$1" > /dev/null X exit 0 X fi X folder="$1" X shift X ;; X esac X for msg in `mhpath $folder "$1"`; do X echo "shar: unpacking ${msg}" X sed -e '1,/^[:#]/d' "$msg" | sh X done X shift Xdone EOF chars=`wc -c < 'muns'` if test $chars != 380; then echo 'muns' is $chars characters, should be 380 characters!; fi fi echo extracting 'mpatch' if test -f 'mpatch' -a -z "$1"; then echo Not overwriting 'mpatch'; else sed 's/^X//' << \EOF > 'mpatch' X: X# apply a patch, extracting from the file the proper command if possible X# and if not, defaulting. (This picks up any necessary "-p" flags, etc.) X# MH version X Xif [ $# = 0 ]; then X echo "usage: mpatch [+folder] msgs [[+folder] msgs] ..." >&2 X exit 1 Xfi Xwhile [ $# -gt 0 ]; do X folder= X case "$1" in X +*) if [ $# = 1 ]; then X mhpath "$1" > /dev/null X exit 0 X fi X folder="$1" X shift X ;; X esac X for msg in `mhpath $folder "$1"`; do X patch="`sed -n 's/^.*Outside of rn, say \"cd DIR; \([^<][^<]*\).*$/\1/p' $msg`" X case "x$patch" in X x) patch="patch -N" ;; X esac X# this also makes the message current so we can use "mpatch next"... X show -noshowproc $folder "$1" | eval "$patch" X done X shift Xdone EOF chars=`wc -c < 'mpatch'` if test $chars != 739; then echo 'mpatch' is $chars characters, should be 739 characters!; fi fi echo extracting 'muuns' if test -f 'muuns' -a -z "$1"; then echo Not overwriting 'muuns'; else sed 's/^X//' << \EOF > 'muuns' Xif [ $# = 0 ]; then X echo "usage: muuns [+folder] msgs [[+folder] msgs] ..." >&2 X exit 1 Xfi Xwhile [ $# -gt 0 ]; do X folder= X case "$1" in X +*) if [ $# = 1 ]; then X mhpath "$1" > /dev/null X exit 0 X fi X folder="$1" X shift X ;; X esac X for msg in `mhpath "$folder" "$1"`; do X uuns "$msg" X done X shift Xdone EOF chars=`wc -c < 'muuns'` if test $chars != 330; then echo 'muuns' is $chars characters, should be 330 characters!; fi fi echo extracting 'uuns' if test -f 'uuns' -a -z "$1"; then echo Not overwriting 'uuns'; else sed 's/^X//' << \EOF > 'uuns' Xeval "exec perl -S $0 $*" X if $running_under_a_shell; X X# X# (attempt to) unshar a comp.binaries.ibm.pc-style multipart uuencode X# X Xunshift(@ARGV, '-') if $#ARGV < 0; Xwhile ($thisfile = shift(@ARGV)) { X print "extracting $thisfile\n"; X open(part, $thisfile); X # collect header information X $thispart = 1; X $lastpart = 1; X while (<part>) { X if (/^part([0-9][0-9])\/([0-9][0-9])$/) { X $thispart = $1; X $lastpart = $2; X next; X } X last if /^BEGIN--/; X } X X # now process submission to line starting with END-- X $outemp = '>part' . $thispart; X open(outemp); X while (<part>) { X last if /^END--/; X print outemp; X } X close(outemp); X} X X# all done? Xprint "checking..."; Xopen(filelist, 'ls part[0-9][0-9]|'); X$haveall = 1; X$current = 1; Xwhile (<filelist>) { X $thisone = $_; X $thisone =~ s/part//; X chop($thisone); X print " ", $thisone + 0; X $haveall = 0 if $thisone != $current; X $current++; X} Xprint " (of ", $lastpart + 0, " parts)\n"; Xclose(filelist); Xexit unless $haveall && $current == $lastpart + 1; X X# combine and uudecode parts Xprint "decoding\n"; Xopen(uudecode, '|uudecode'); X$current = 1; Xwhile ($current <= $lastpart) { X open(part, 'part' . sprintf('%02d', $current)); X while (<part>) { X print uudecode; X } X close(part); X $current++; X} Xclose(uudecode); Xsystem('rm -f part[0-9][0-9]'); EOF chars=`wc -c < 'uuns'` if test $chars != 1358; then echo 'uuns' is $chars characters, should be 1358 characters!; fi fi exit 0 -- Brandon S. Allbery, comp.sources.misc moderator and one admin of ncoast PA UN*X uunet!hal.cwru.edu!ncoast!allbery ncoast!allbery@hal.cwru.edu comp.sources.misc is moving off ncoast -- please do NOT send submissions direct Send comp.sources.misc submissions to comp-sources-misc@<backbone>.