#!/usr/bin/env python """ List maildirs in your Maildir++ with message counts. """ from __future__ import division, print_function import os import os.path import re def maildirs(startdir): for dirpath, dirnames, _ in os.walk(startdir): if set(['cur', 'new', 'tmp']).issubset(set(dirnames)): yield dirpath def maildir_count(maildir): def dir_count(dir_): return len(os.listdir(dir_)) cur = dir_count(os.path.join(maildir, 'cur')) new = dir_count(os.path.join(maildir, 'new')) all_ = cur + new return (new, all_) def mailbox_name(maildir, root): name = re.sub(root + r'/?\.?', '', maildir) if name == '': return 'INBOX' else: return name ignore_zero = True ignore = [r'spam'] sort_by_count = True root = os.path.expanduser('~/Maildir') counts = {} for maildir in maildirs(root): name = mailbox_name(maildir, root) _, all_ = maildir_count(maildir) if all_ == 0 and ignore_zero: continue if any(re.match(i, name) for i in ignore): continue counts[name] = all_ if sort_by_count: key = lambda i: i[1] reverse = True else: key = lambda i: i[0] reverse = False length_name = max(len(name) for name in counts.keys()) length_count = max(len(str(count)) for count in counts.values()) for name, count in sorted(counts.items(), key=key, reverse=reverse): print('{0:{1}}\t{2:{3}d}'.format(name, length_name, count, length_count))