mu-query - Man Page
a language for finding messages in mu databases.
Description
The mu query language is the language used by mu find and mu4e to find messages in mu's Xapian database. The language is quite similar to Xapian's default query-parser, but is an independent implementation that is customized for the mu/mu4e use-case.
Here, we give a structured but informal overview of the query language and provide examples. As a companion to this, we recommend the mu fields and mu flags commands to get an up-to-date list of the available fields and flags.
Furthermore, mu find provides the --analyze
option, which shows how mu interprets your query; see the ANALYZING QUERIES section below.
NOTE: if you use queries on the command-line (say, for mu find), you need to quote any characters that would otherwise be interpreted by the shell, such as "", ( and ) and whitespace.
Terms
The basic building blocks of a query are terms; these are just normal words like to just that field. See mu info fields for all the available fields.
Some example queries:
vacation subject:capybara maildir:/inbox
Terms without an explicit field-prefix, (like 'vacation' above) are interpreted like:
to:vacation or subject:vacation or body:vacation or ...
The language is case-insensitive for terms and attempts to 'flatten' diacritics, so angtrom matches Ångström.
If terms contain whitespace, they need to be quoted:
subject:"hi there"
This is a so-called phrase query, which means that we match against subjects that contain the literal phrase "hi there". Phrase queries only work for fields that are indexed, i.e., fields with index in the mu info fields search column.
Remember that you need to escape those quotes when using this from the command-line:
mu find subject:\"hi there\"
Logical Operators
We can combine terms with logical operators -- binary ones: and, or, xor and the unary not, with the conventional rules for precedence and association. The operators are case-insensitive.
You can also group things with ( and ), so you can write:
(subject:beethoven or subject:bach) and not body:elvis
If you do not explicitly specify an operator between terms, and is implied, so the queries
subject:chip subject:dale
subject:chip AND subject:dale
are equivalent. For readability, we recommend the second version.
Note that a pure not - e.g. searching for not apples is quite a 'heavy' query.
Regular Expressions and Wildcards
The language supports matching basic PCRE regular expressions, see pcre(3).
Regular expressions are enclosed in //. Some examples:
subject:/h.llo/ # match hallo, hello, ... subject:/
Note the difference between 'maildir:/foo' and 'maildir:/foo/'; the former matches messages in the '/foo' maildir, while the latter matches all messages in all maildirs that match 'foo', such as '/foo', '/bar/cuux/foo', '/fooishbar' etc.
Wildcards are another mechanism for matching where a term with a rightmost * (and only in that position) matches any term that starts with the part before the *; they are therefore less powerful than regular expressions, but also much faster:
foo*
is equivalent to
/foo.*/
Regular expressions can be useful, but are relatively slow.
Fields
We already saw a number of search fields, such as subject: and body:. For the full table with all details, including single-char shortcuts, try the command: mu info fields
.
field-namealiasdescription | ||
bcc | Blind carbon-copy recipient | |
body | Message plain-text body | |
cc | Carbon-copy recipient | |
changed | Last change time | |
date | Message date | |
embed | Embedded text | |
file | Attachment file name | |
flags | flag | Message properties |
from | Message sender | |
language | lang | ISO 639-1 language code (*) |
maildir | Maildir path for message | |
list | Mailing list (List-Id:) | |
message-id | msgid | Message-Id |
mime | mime-type | Attachment MIME-type |
path | File system path to message | |
priority | prio | Priority |
references | References to related messages | |
size | Message size in bytes | |
subject | Message subject | |
tags | tag | Message tags |
thread | Thread a message belongs to | |
to | Message recipient |
(*) The language code for the text-body if found. This works only if mu
was built with CLD2 support.
There are also the special fields contact:, which matches all contact-fields (from, to, cc and bcc), and recip, which matches all recipient-fields (to, cc and bcc).
Hence, for instance,
contact:fnorb@example.com
is equivalent to
(from:fnorb@example.com or to:fnorb@example.com or cc:from:fnorb@example.com or bcc:fnorb@example.com)
Date Ranges
The date: field takes a date-range, expressed as the lower and upper bound, separated by ... Either lower or upper (but not both) can be omitted to create an open range.
Dates are expressed in local time and using ISO-8601 format (YYYY-MM-DD HH:MM:SS); you can leave out the right part and mu adds the rest, depending on whether this is the beginning or end of the range (e.g., as a lower bound, end of the year).
You can use '/' , '.', '-', ':' and 'T' to make dates more human-readable.
Some examples:
date:20170505..20170602 date:2017-05-05..2017-06-02 date:..2017-10-01T12:00 date:2015-06-01.. date:2016..2016
You can also use the special 'dates' now and today:
date:20170505..now date:today..
Finally, you can use relative 'ago' times which express some time before now and consist of a number followed by a unit, with units s for seconds, M for minutes, h for hours, d for days, w for week, m for months and y for years. Some examples:
date:3m.. date:2017.01.01..5w
Size Ranges
The size or z field allows you to match size ranges -- that is, match messages that have a byte-size within a certain range. Units (b (for bytes), K (for 1000 bytes) and M (for 1000 * 1000 bytes) are supported). Some examples:
size:10k..2m size:10m..
Flag Field
The flag/g field allows you to match message flags. The following fields are available:
a,attach Message with attachment d,draft Draft Message f,flagged Flagged l,list Mailing-list message n,new New message (in new/ Maildir) p,passed Passed ('Handled') r,replied Replied s,seen Seen t,trashed Marked for deletion u,unread new OR NOT seen x,encrypted Encrypted message z,signed Signed message
Some examples:
flag:attach flag:replied g:x
Encrypted messages may be signed as well, but this is only visible after decrypting and thus invisible to mu.
Priority Field
The message priority field (prio:) has three possible values: low, normal or high. For instance, to match high-priority messages:
prio:high
Maildir
The Maildir field describes the directory path starting after the Maildir root directory, and before the /cur/ or /new/ part. So, for example, if there's a message with the file name ~/Maildir/lists/running/cur/1234.213:2,, you could find it (and all the other messages in that same maildir) with:
maildir:/lists/running
Note the starting ''. If you want to match mails in the 'root' maildir, you can do with a single '':
maildir:/
If you have maildirs (or any fields) that include spaces, you need to quote them, ie.
maildir:"/Sent Items"
And once again, note that when using the command-line, such queries must be quoted:
mu find 'maildir:"/Sent Items"'
Also note that you should not end the maildir with a /
, or it can be misinterpreted as a regular expression term; see aforementioned.
More Examples
Here are some simple examples of mu queries; you can make many more complicated queries using various logical operators, parentheses and so on, but in the author's experience, it's usually faster to find a message with a simple query just searching for some words.
Find all messages with both 'bee' and 'bird' (in any field)
bee AND bird
Find all messages with either Frodo or Sam:
Frodo OR Sam
Find all messages with the 'wombat' as subject, and 'capybara' anywhere:
subject:wombat and capybara
Find all messages in the 'Archive' folder from Fred:
from:fred and maildir:/Archive
Find all unread messages with attachments:
flag:attach and flag:unread
Find all messages with PDF-attachments:
mime:application/pdf
Find all messages with attached images:
mime:image/*
Find all messages written in Dutch or German with the word 'hallo':
hallo and (lang:nl or lang:de)
This is only available if your mu has support for this; see mu info and check for "cld2-support*.
Analzying Queries
Despite all the excellent documentation, in some cases it can be non-obvious how mu
interprets your query. For that, you can ask mu
to analyze the query -- that is, show how mu
interprets the query.
This uses the the --analyze
option to mu find. #+beginexample $ mu find subject:wombat AND date:3m.. size:..2000 --analyze
query
subject:wombat AND date:3m.. size:..2000
parsed query
(and (subject "wombat") (date (range "2023-05-30T06:10:09Z" "")) (size (range "" "2000")))
Xapian query
Query((Swombat AND VALUEGE 4 n64759341 AND VALUELE 17 i7d0)) #+endexample
The parsed query
is usually the most useful one for understanding how mu interprets your query.
Reporting Bugs
Please report bugs at https://github.com/djcb/mu/issues.
Author
Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
Copyright
This manpage is part of mu
1.12.1.
Copyright © 2008-2024 Dirk-Jan C. Binnema. License GPLv3+: GNU GPL version 3 or later https://gnu.org/licenses/gpl.html. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.