---
name: "mpick"
section: "1"
platform: "linux"
package: "mblaze"
version: "1.1-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/mpick"
---

# mpick(1)

advanced message filter

## NAME

**mpick** – advanced message filter

## SYNOPSIS

**mpick** \[**-F** *file*\] \[**-T**\] \[**-v**\] \[**-t** *test*\] \[*msgs ...*\]

## DESCRIPTION

**mpick** prints all matching messages.

If used interactively, **mpick** will default to the current sequence. Otherwise, **mpick** will read filenames from the standard input.

The options are as follows:

- **-F** *file*

  Read expression from *file* and only show matching messages, see TESTS. *file*,

- **-T**

  Include whole thread.

- **-t** *test*

  Only show messages matching the expression *test*, see TESTS.

- **-v**

  Print how many messages were tested and picked to standard error.

## TESTS

**mpick** tests are given by the following EBNF:

```
<expr>     ::= <expr> ? <expr> : <expr>  -- ternary operator
             | <expr> || <expr>  -- disjunction
             | <expr> && <expr>  -- conjunction
             | ! <expr>          -- negation
             | ( <expr> )
             | <expr> "|"  <str> -- pipe current mail to command
             | <expr> ">>" <str> -- append current mail to file
             | <expr> ">"  <str> -- write current mail to file
             | <flagprop>
             | <timeprop> <numop> <dur>
             | <numprop> <numop> <num>
             | <hdrprop> <decodeop> <strop> <str>
             | <strprop> <strop> <str>
             | prune             -- do not match further messages in thread
             | print             -- always true value
             | skip              -- always false value
             | <let>
             | <ident>
<flagprop> ::= child | draft | flagged | info | new | parent | passed
             | replied  | seen | selected | trashed
<timeprop> ::= atime | ctime | mtime | date
<numprop>  ::= depth | kept | replies | index | size | total
<numop>    ::= <= | < | >= | > | == | = | !=
<dur>      ::= "./path"          -- mtime of relative path
             | "/path"           -- mtime of absolute path
             | "YYYY-MM-DD HH:MM:SS"
             | "YYYY-MM-DD"      -- at midnight
             | "HH:MM:SS"        -- today
             | "HH:MM"           -- today
             | "-[0-9]+d"        -- n days ago at midnight
             | "-[0-9]+h"        -- n hours before now
             | "-[0-9]+m"        -- n minutes before now
             | "-[0-9]+s"        -- n seconds before now
             | [0-9]+            -- absolute epoch time
<num>      ::= [0-9]+ ( c        -- *1
                      | b        -- *512
                      | k        -- *1024
                      | M        -- *1024*1024
                      | G        -- *1024*1024*1024
                      | T )?     -- *1024*1024*1024*1024
             | cur               -- index of cur message
<hdrprop>  ::= from | to | subject | <str>
<decodeop> ::= . addr          -- match address parts
             | . disp          -- match address display parts
             |                 -- empty matches raw headers
<strprop>  ::= path
<strop>    ::= == | = | !=       -- string (in)equality
             | ===    | !===     -- case insensitive string (in)equality
             | ~~     | !~~      -- glob (fnmatch)
             | ~~~    | !~~~     -- case insensitive glob (fnmatch)
             | =~     | !=~ | !~ -- POSIX Extended Regular Expressions
             | =~~    | !=~~     -- case insensitive POSIX Extended Regular Expressions
<str>      ::= " ([^"] | "")+ "  -- use "" for a single " inside "
             | $[A-Za-z0-9_]+    -- environment variable
-- let expressions evaluate the expression following the `in` keyword,
-- the bindings are lazily evaluated.
<let>      ::= { let <ident> = <scope> } in <scope>
-- Inside the scope previously defined idents are replaced with expressions
<scope>    ::= <expr>
<ident>    ::= [A-Za-z_][A-Za-z0-9_]+
```

## EXIT STATUS

The **mpick** utility exits 0 on success, and \>0 if an error occurs.

## EXAMPLES

You can pick mails to move them into another maildir.

```
mv $(mlist ./INBOX | mpick -t 'from =~ "@github"') ./github/cur
```

Or you can use **mpick** to pick mails from the current sequence.

```
mpick -t 'subject =~~ "mblaze"' | mscan
```

A more advanced **mpick** expression to pick mails in a certain time span, which are flagged as replied or not seen.

```
mpick -t 'date >= "2016-01-01" && date < "2017-01-01" && (replied || !seen)'
```

And to find other mblaze users.

```
mpick -t '"User-Agent" =~~ "mblaze"' | mscan
```

## SEE ALSO

[lr(1)](/lr/1.md), [mailx(1)](/mailx/1.md)

## AUTHORS

Leah Neukirchen ⟨*leah@vuxu.org*⟩ Duncan Overbruck ⟨*mail@duncano.de*⟩

## LICENSE

**mpick** is in the public domain.

To the extent possible under law, the creator of this work has waived all copyright and related or neighboring rights to this work.

**http://creativecommons.org/publicdomain/zero/1.0/**
