NAME
pick - search for messages by content
SYNOPSIS
pick [+folder] [msgs] [-and ...] [-or ...] [-not ...] [-lbrace ...
-rbrace] [--component pattern] [-cc pattern] [-date pattern]
[-from pattern] [-search pattern] [-subject pattern] [-to pattern]
[-after date] [-before date] [-datefield field] [-sequence name
...] [-public | -nopublic] [-zero | -nozero] [-list | -nolist]
[-version] [-help]
typical usage:
scan ‘pick -from jones‘
pick -to holloway -sequence select
show ‘pick -before friday‘
DESCRIPTION
Pick searches within a folder for messages with the specified contents,
and then identifies those messages. Two types of search primitives are
available: pattern matching and date constraint operations.
A modified grep(1) is used to perform the matching, so the full regular
expression (see ed(1)) facility is available within pattern. With
-search, pattern is used directly, and with the others, the grep
pattern constructed is:
‘component[ \t]*:.*pattern’
This means that the pattern specified for a -search will be found
everywhere in the message, including the header and the body, while the
other pattern matching requests are limited to the single specified
component. The expression
‘--component pattern’
is a shorthand for specifying
‘-search “component[ \t]*:.*pattern” ’
It is used to pick a component which is not one of “To:”, “cc:”,
“Date:”, “From:”, or “Subject:”. An example is “pick --reply-to pooh”.
Pattern matching is performed on a per-line basis. Within the header
of the message, each component is treated as one long line, but in the
body, each line is separate. Lower-case letters in the search pattern
will match either lower or upper case in the message, while upper case
will match only upper case.
Note that since the -date switch is a pattern matching operation (as
described above), to find messages sent on a certain date the pattern
string must match the text of the “Date:” field of the message.
Independent of any pattern matching operations requested, the switches
-after date or -before date may also be used to introduce date/time
constraints on all of the messages. By default, the “Date:” field is
consulted, but if another date yielding field (such as “BB-Posted:” or
“Delivery-Date:”) should be used, the -datefield field switch may be
used.
With -before and -after, pick will actually parse the date fields in
each of the messages specified in ‘msgs’ and compare them to the
date/time specified. If -after is given, then only those messages
whose “Date:” field value is chronologically after the date specified
will be considered. The -before switch specifies the complimentary
action.
Both the -after and -before switches take legal 822-style date
specifications as arguments. Pick will default certain missing fields
so that the entire date need not be specified. These fields are (in
order of defaulting): timezone, time and timezone, date, date and
timezone. All defaults are taken from the current date, time, and
timezone.
In addition to 822-style dates, pick will also recognize any of the
days of the week (“sunday”, “monday”, and so on), and the special dates
“today”, “yesterday” (24 hours ago), and “tomorrow” (24 hours from
now). All days of the week are judged to refer to a day in the past
(e.g., telling pick “saturday” on a “tuesday” means “last saturday” not
“this saturday”).
Finally, in addition to these special specifications, pick will also
honor a specification of the form “-dd”, which means “dd days ago”.
Pick supports complex boolean operations on the searching primitives
with the -and, -or, -not, and -lbrace ... -rbrace switches. For
example,
pick -after yesterday -and
-lbrace -from freida -or -from fear -rbrace
identifies messages recently sent by “frieda” or “fear”.
The matching primitives take precedence over the -not switch, which in
turn takes precedence over -and which in turn takes precedence over
-or. To override the default precedence, the -lbrace and -rbrace
switches are provided, which act just like opening and closing
parentheses in logical expressions.
If no search criteria are given, all the messages specified on the
command line are selected (this defaults to “all”).
Once the search has been performed, if the -list switch is given, the
message numbers of the selected messages are written to the standard
output separated by newlines. This is extremely useful for quickly
generating arguments for other nmh programs by using the “backquoting”
syntax of the shell. For example, the command
scan ‘pick +todo -after “31 Mar 83 0123 PST”‘
says to scan those messages in the indicated folder which meet the
appropriate criterion. Note that since pick’s context changes are
written out prior to scan’s invocation, you need not give the folder
argument to scan as well.
The -sequence name switch may be given once for each sequence the user
wishes to define. For each sequence named, that sequence will be
defined to mean exactly those messages selected by pick. For example,
pick -from frated -seq fred
defines a new message sequence for the current folder called “fred”
which contains exactly those messages that were selected.
By default, pick will zero the sequence before adding it. This action
can be disabled with the -nozero switch, which means that the messages
selected by pick will be added to the sequence, if it already exists,
and any messages already a part of that sequence will remain so.
The -public and -nopublic switches are used by pick in the same way
mark uses them.
FILES
$HOME/.mh_profile The user profile
PROFILE COMPONENTS
Path: To determine the user’s nmh directory
Current-Folder: To find the default current folder
SEE ALSO
mark(1)
DEFAULTS
‘+folder’ defaults to the current folder
‘msgs’ defaults to all
‘-datefield date’
‘-zero’
‘-list’ is the default if no ‘-sequence’, ‘-nolist’ otherwise
CONTEXT
If a folder is given, it will become the current folder.
HISTORY
In previous versions of MH, the pick command would show, scan, or
refile the selected messages. This was rather “inverted logic” from
the UNIX point of view, so pick was changed to define sequences and
output those sequences. Hence, pick can be used to generate the
arguments for all other MH commands, instead of giving pick endless
switches for invoking those commands itself.
Also, previous versions of pick balked if you didn’t specify a search
string or a date/time constraint. The current version does not, and
merely matches the messages you specify. This lets you type something
like:
show ‘pick last:20 -seq fear‘
instead of typing
mark -add -nozero -seq fear last:20
show fear
Finally, timezones used to be ignored when comparing dates: they aren’t
any more.
HELPFUL HINTS
Use “pick sequence -list” to enumerate the messages in a sequence (such
as for use by a shell script).
BUGS
The argument to the -after and -before switches must be interpreted as
a single token by the shell that invokes pick. Therefore, one must
usually place the argument to this switch inside double-quotes.
Furthermore, any occurrence of -datefield must occur prior to the
-after or -before switch it applies to.
If pick is used in a back-quoted operation, such as
scan ‘pick -from jones‘
and pick selects no messages (e.g., no messages are from “jones”), then
the shell will still run the outer command (e.g., scan). Since no
messages were matched, pick produced no output, and the argument given
to the outer command as a result of backquoting pick is empty. In the
case of nmh programs, the outer command now acts as if the default
‘msg’ or ‘msgs’ should be used (e.g., “all” in the case of scan). To
prevent this unexpected behavior, if -list was given, and if its
standard output is not a tty, then pick outputs the illegal message
number “0” when it fails. This lets the outer command fail gracefully
as well.
The pattern syntax “[l-r]” is not supported; each letter to be matched
must be included within the square brackets.