PICK(1)

NAME
pick - メッセージ内容を検索する

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] [-help]
典型例:
scan `pick -from jones`
pick -to holloway -sequence select
show `pick -before friday`

DESCRIPTION
pick はフォルダ内のメッセージから指定した内容を探し、 見つかったメッセージを識別します。 二つのタイプの検索要素が使えます。すなわち、パターンマッチと日付制限です。 パターンマッチには grep(1) の改変版が使われていて、 `pattern' には正規表現(ed(1) 参照)が使えます。 `-search' オプションと共に使うと、`pattern' は直接使え、 その他のオプションと共に使うと、grep パターンは以下のように解釈されます。
"component[ \t]*:.*pattern" この事は、`-search' オプションで指定されたパターンはメッセージ中の全て、 ヘッダーもボディも検索されますが、その他のパターンマッチは ヘッダー内の指定のコンポーネントだけが検索される事を意味します。 書式
`--component pattern' は以下の省略形と考えられます。
`-search "component[ \t]*:.*pattern" ' "To:"、"cc:"、"Date:"、"From:"、 または "Subject:" のどれでもないコンポーネントを検索する事も 出来ます。 例えば、`pick --reply-to pooh' という風にです。 パターンマッチは基本的には行単位で行なわれます。 メッセージのヘッダー内では、 それぞれのコンポーネントは一つの長い行として扱われますが、 ボディではそれぞれの行は分割して扱われます。 検索パターン中の小文字はメッセージ中の大文字にも小文字にもマッチしますが、 大文字は大文字のみにマッチします。 また、ヘッダーが RFC-2047 エンコードされている場合、 検索文字列にデコード後の文字列を指定して、 そのエンコード文字列にマッチさせる事が出来ます。 `-date' オプションに対しても(上述の)パターンマッチ処理が行なわれます。 従って、ある日に出されたメッセージを探す場合、パターン文字列は メッセージの "Date:" 行のテキストにマッチしなければなりません。 任意のパターンマッチ処理とは独立に、 `-after date' または `-before date' オプションを 全てのメッセージについての日付/時刻制限に使う事が出来ます。 デフォルトでは、"Date:" 行が参照されますが、 他に日付に関するヘッダーがある場合は ("BB-Posted:" や "Delivery-Date:" のようなの)、 `-datefield field' オプションで指定できます。 `-before' や `-after' を付けると、 pick は `msgs' で指定されたメッセージそれぞれの日付行を解析し、 指定された日付/時刻と比較します。 `-after' が指定されると、 "Date:" 行の値が指定の日から時間的に後であるメッセージだけが 考慮されます。 `-before' はその逆です。 `-after' と `-before' オプションは共に、 引数として、RFC-822 形式の日付表記を指定する事が出来ます。 この場合、完全な日付表記は必要なく、 pick は抜けている部分をデフォルトで補います。 これら、デフォルトが使える部分は、 タイムゾーン、時刻とタイムゾーン、日付、日付とタイムゾーンです。 全てのデフォルトは現在の日付、時刻、タイムゾーンです。 RFC-822 形式の日付に加えて、 pick は任意の曜日 ("sunday"、"monday"、など)、 特別な日である "today"、"yesterday" (24時間前)、 そして "tomorrow" (24時間後)を認識します。 全ての曜日は過去の日を意味します (例えば、火曜日に pick に "saturday" と指定した場合、 それは先週の土曜日の意味であって、今週の土曜日の事ではありません)。 最後に、これら特別な指定に加えて、 pick は "-dd" という形式を認識します。 これの意味は "dd" 日前です。 pick は検索指定の際に複雑な論理演算子を認識します。 `-and'、`-or'、`-not'、そして `-lbrace ... -rbrace' オプションです。 例えば、
pick -after yesterday -and
-lbrace -from freida -or -from fear -rbrace は最近に "frieda" か "fear" から送られてきたメッセージを 捜し出します。 それぞれの検索オプションが、`-not' オプションより優先され、 それは `-and' より優先され、 それは `-or' より優先されます。 このデフォルトの優先順位を変えるためには、 `-lbrace' と `-rbrace' オプションが使えます。 これらはそれぞれ、論理式に於ける左括弧と右括弧に相当します。 もし検索オプションが何も指定されなかった場合、 指定されたメッセージ (このデフォルトは "all") の全てが選択されます。 一旦、検索が終了した時、 `-list' オプションが指定されていると、 選択されたメッセージのメッセージ番号が改行で区切られて、 標準出力に書き出されます。 これはシェルのバッククォート処理を使って、他の MH プログラムに 素早く引数を与える目的に、極めて有用です。 例えば、コマンド
scan `pick +todo -after "31 Mar 83 0123 PST"` は指定のフォルダで、検索により選択されたメッセージだけを scan します。 pick によるコンテクスト・ファイルの変化は scan が呼び出される前に書き出される点に注目して下さい。 つまり、scan の方にはフォルダ名を指定する必要がない訳です。 `-list' オプションによる結果は使わずに、 `-sequence name' オプションを、ユーザーが定義したいそれぞれのシーケンスに ついて一つずつ指定しても構いません。 それぞれのシーケンス名は、 pick が選択したメッセージを正確に意味するように定義されます。 例えば、
pick -from frated -seq fred はカレント・フォルダに "fred" という名前の新しいシーケンスを定義し、 それは選び出されたメッセージを正確に含みます。これは例えば、 "scan fred" などで利用可能です。さらに、
pick -before friday -seq fred fred と絞り込み等にも利用できます。 pick が `-sequence name' オプションを処理する時は常に `-nolist' が指定される事に注意して下さい。 デフォルトでは、pick はシーケンスに追加する前に、 それまでのシーケンスの内容を消します。 この動作は `-nozero' オプションで抑制されます。 これは pick で選択されたメッセージが指定のシーケンスに追加される 事を意味します。そして、そのシーケンスに含まれていたメッセージはそのまま 残ります。 `-public' と `-nopublic' オプションは mark 同様の事を pick に指定します。
$HOME/.mh_profile    ユーザーのプロファイル
Path:    ユーザーの MH ディレクトリを決める
Current-Folder:    デフォルトのカレント・フォルダを示す
mark(1)
`+folder'    デフォルトはカレント・フォルダ
`msgs'    デフォルトは all
`-datefield date'
`-nopublic'    フォルダが書き込み禁止の場合。さもなくば、`-public'
`-zero'
`-list'    `-sequence' の場合、デフォルト。さもなくば、`-nolist'
もしフォルダが指定されれば、それがカレント・フォルダになります。 以前のバージョンの MH では、 pick コマンドは選択されたメッセージを show、scan、または refile してました。 オプションにより、これらの動作のどれかが行なわれていた訳ですが、 これは UNIX 的な物の見方に反するような考え方とも言えます。 そこで、pick はシーケンスを定義し、 そのシーケンスを出力するという風に変更されました。 従って、 pick に他の MH コマンドを呼び出すようなオプションを 追加し続ける代わりに、pick を使って、それらのコマンドの引数を 生成する事が出来ます。 また、以前のバージョンの pick は検索文字列や日付/時刻制限を指定しない 場合にはエラーになっていました。 現在のバージョンではそんな事はなく、 単に指定したメッセージの全てにマッチします。 これにより、例えば次のような事が出来ます。
show `pick last:20 -seq fear` これは、次の代わりです。
mark -add -nozero -seq fear last:20
show fear
最後に、 以前のものは、日付の比較の際にタイムゾーンは無視されてましたが、 現在のものはそんな事はないです。 シーケンスに含まれているメッセージを並べ挙げるには "pick sequence -list" を使いましょう (シェルスクリプトなどで使うような時)。 `-after' と `-before' に対する引数は、pick を呼び出すシェルにとって 一語として解釈される形でなければなりません。 従って、通常、 これらのオプションに対する引数はダブル・クォートで囲まれなければなりません。 さらに、`-datefield' オプションは、それが適応される `-after' や `-before' オプションの前に置かれなければなりません。 もし pick が次のようなバッククォート処理を行ない、
scan `pick -from jones` pick が何もメッセージを選択しなかった場合 (例えば、"jones" から来たメッセージがなかった場合)、 シェルはまだ外側のコマンド(例えば "scan")を実行しようとします。 マッチするメッセージがなかったので、 pick は何も出力しません。 そして、pick をバッククォートした結果として、外側のコマンドに 与えられる引数は空になります。 MH プログラムの場合、引数がないと、 外側のプログラムは、あたかもデフォルトの `msg' または `msgs' であるかの ように振舞います (例えば scan の場合は "all")。 この期待されない振舞いを避けるためには、 もし `-list' が指定され、その標準出力が端末でない場合は、 pick は見つからなかった時に不正なメッセージ番号 "0" を 出力すべきでしょう。 これにより外側のコマンドがうまく失敗してくれるでしょう。

正規表現では "[l-r]" というパターン文法はサポートされてません。 マッチさせたい全ての文字を角括弧の中に書かなければなりません。