---
name: "scan"
section: "1mh"
platform: "linux"
package: "nmh"
version: "1.8-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/scan/1mh"
---

# scan(1mh)

produce a summary listing of nmh messages

## NAME

scan - produce a summary listing of nmh messages

## SYNOPSIS

**scan** \[**-help**\] \[**-version**\] \[*+folder*\] \[*msgs*\] \[**-clear** \| **-noclear**\] \[**-form** *formatfile*\] \[**-format** *string*\] \[**-header** \| **-noheader**\] \[**-width** *columns*\] \[**-reverse** \| **-noreverse**\] \[**-file** *filename*\]

## DESCRIPTION

**scan** produces a one-line-per-message listing of the specified folder or messages.  Each **scan** line contains the message number (name), the date, the “From:” field, the “Subject” field, and, if room allows, some of the body of the message.  For example:

```
15+	10/05 crocker	nned  <<Last week I asked some of
16-	10/05 crocker	message id format  <<I recommend
18	10/06 brien	Re: Exit status from mkdir
19	10/07*brien	“scan” listing format in nmh
```

The \`+' on message 15 indicates that it is the current message.

The \`-' on message 16 indicates that it has been replied to, as indicated by a “Replied:” component (produced by the **-annotate** switch to the **repl** command).

The \`\*' on message 19 indicates that no “Date:” header was present.  The time of last modification of the message is given instead.

If there is sufficient room left on the **scan** line after the subject, the line will be filled with text from the body, preceded by “\<\<”, and terminated by “\>\>” if the body is sufficiently short. **scan** actually reads each of the specified messages and parses them to extract the desired fields.  During parsing, appropriate error messages will be produced if there are format errors in any of the messages.

By default, **scan** will decode RFC 2047 (MIME) encoding in these scan listings. **scan** will only decode these fields if your terminal can natively display the character set used in the encoding. You should set the appropriate [*locale*(1)](/locale/1.md) environment variables to your native character set, if it is not US-ASCII.  See [*locale*(1)](/locale/1.md) for more details on the appropriate environment variables.

The switch **-reverse**, makes **scan** list the messages in reverse order.

The **-file** *filename* switch allows the user to obtain a **scan** listing of a mail drop. This listing includes every message in the mail drop (you can't scan individual messages). The switch **-reverse** is ignored with this option. If *filename* is a file, it can be in **mbox** or **MMDF** format, as produced by **packf**. If *filename* is a directory, it is considered to be in **Maildir** format.

The switch **-width** *columns* may be used to specify the width of the scan line.  The default is to use the width of the terminal.

The **-header** switch produces a header line prior to the **scan** listing.  Currently, the name of the folder and the current date and time are output (see the **HISTORY** section for more information).

If the **-clear** switch is used and **scan**'s output is directed to a terminal, then **scan** will consult the environment variables **$TERM** and **$TERMCAP** to determine your terminal type in order to find out how to clear the screen prior to exiting.  If the **-clear** switch is used and **scan**'s output is not directed to a terminal (e.g., a pipe or a file), then **scan** will send a formfeed prior to exiting.

For example, the command:

(scan -clear -header; show all -show pr -f) \| lpr

produces a scan listing of the current folder, followed by a formfeed, followed by a formatted listing of all messages in the folder, one per page.  Omitting “**-show pr -f**” will cause the messages to be concatenated, separated by a one-line header and two blank lines.

To override the output format used by **scan**, the **-format** *string* or **-form** *file* switches are used.  This permits individual fields of the scan listing to be extracted with ease.  The string is simply a format string and the file is simply a format file.  See [*mh-format*(5)](/mh-format/5.md) for the details.

In addition to the standard [*mh-format*(5)](/mh-format/5.md) escapes, **scan** also recognizes the following additional *component* escapes:

```
Escape	Returns	Description
body	string	the (compressed) first part of the body
dtimenow	date	the current date
folder	string	the name of the current folder
```

{**body**} returns a string without MIME decoding, i.e. the MIME boundary separator may be the first text shown.

If no date header is present in the message, the *function* escapes which operate on {**date**} will return values for the date of last modification of the message file itself.  This feature is handy for scanning a draft folder, as message drafts usually aren't allowed to have dates in them.

The **/etc/nmh** directory contains several format files as examples of customized **scan** output.

**scan** will update the **nmh** context prior to starting the listing, so interrupting a long **scan** listing preserves the new context. **nmh** purists hate this idea.

## FILES

```
^$HOME/.mh_profile~^The user profile
```

## PROFILE COMPONENTS

```
^Path:~^To determine the user's nmh directory
^Alternate-Mailboxes:~^To determine the user's mailboxes
^Current-Folder:~^To find the default current folder
```

## SEE ALSO

[*pick*(1)](/pick/1.md), [*show*(1)](/show/1.md), [*mh-format*(5)](/mh-format/5.md)

## DEFAULTS

```
`+folder' defaults to the current folder
`msgs' defaults to all
`-format' defaulted as described above
`-noheader'
`-width' defaulted to the width of the terminal
```

## CONTEXT

If a folder is given, it will become the current folder.

## HISTORY

Prior to using the format string mechanism, **-header** used to generate a heading saying what each column in the listing was.  Format strings prevent this from happening.

## BUGS

The value of each *component* escape is set by **scan** to the contents of the first message header **scan** encounters with the corresponding component name; any following headers with the same component name are ignored.
