Following several responses from this list (thanks all for your comments), I've revised the script.
Notably, the script now copes with mail which has been moved to a /cur/ folder without being read. It does still ignore a few edge-case exceptions, in particular I'm not sure whether it copes in all situations with the "a" status on unread mail (which Thunderbird seems to add), but for my purposes it does the job.
I will be keeping the latest version updated with bugfixes at:
http://www.aoakley.com/articles/2009-01-11-markallread.php
...and would welcome more suggestions and new features. One of the first things that needs adding is variables to allow the maildir path and folder prefix to be configured.
#!/bin/bash # markallread by Andrew Oakley www.aoakley.com Public Domain 2009-01-11 # A script to mark all maildir mail as read, including folders # Assumptions: # * Your maildir folder is ~/.maildir # * Folders use Dovecot IMAP . prefix eg. ~/.maildir/.foldername # * Folder names do not contain spaces
# Loop through ~/.maildir/.foldername/new/ folders
# This also does the ~/.maildir Inbox since it matches ~/.maildir/./new/
for i in ls -1 ~/.maildir/.*/new/*
do
# Move from /new/ to /cur/
# Also add status "seen" to message by appending :2,S to filename
# as per http://cr.yp.to/proto/maildir.html
mv $i echo $i | sed -r "s/^(.*)\/new\/(.*)$/\1\/cur\/\2:2,S/"
done
# Loop through ~/.maildir/.foldername/cur/ folders
# Required in case new mail has been moved to a cur dir without reading
# Note how these already have :2, at the end of the filename
for i in ls -1 ~/.maildir/.*/cur/*:2, 2>/dev/null
do
# Add status "seen" to message by appending S to filename
mv $i echo $i | sed -r "s/^(.*)$/\1S/"
done
-- Andrew Oakley www.aoakley.com