Copying Maildir Contents

July 6th, 2009

I’ve got a bunch of mails (in Maildir format) to move from one server to another. Only problem is that there’s lots of them (60 accounts in 5 different domains, 70GB total). I’m trying to dip my toe in the waters of shell scripting but am a bit lost. If anyone can help out I’d be glad to provide suitable beverages at the next potd!

I’ve written a “pseudo script” which just outlines how I think the job could be done but is lacking in some minor details like proper commands, array setup and generally anything to make the script usable! It should help to describe the task though….

—Start “Pseudo Script”—
# text file containing table mapping old usernames to new usernames
$users = /location/users

#$archivelocation has a bunch of folders named oldusername1, oldusername2 etc each containing the Maildir directory plus other files/directories.
#The Maildir directory contains miscellaneous courier mail files and “new” and “tmp” directories as well as the “cur” directory.
$archivelocation = /location/of/maildir/archives

#$newlocation has a bunch of folders named newusername1, newusername2 etc containing the Maildir directory. They’re all empty so overwriting is not a problem.
$newlocation = /location/of/new/maildirs

#Needed to set permissions on copied content.
$domainusername = somedomain

#All I want to move is partial contents of the Maildir folder i.e. the “cur” folder and all .folders (except .Trash).
#I need to copy the only the required contents from the old Maildir to the new and change ownership/group
#of the copied files to “newusername*.domainusername:$domainusername”

#With my (very basic) knowledge of commands I would do this…

cp -frv $archivelocation/$oldusername1fromusersfile/Maildir/cur /$newlocation/$newusername1fromusersfile/Maildir/
cp -frv $archivelocation/$oldusername1fromusersfile/Maildir/./* /$newlocation/$newusername1fromusersfile/Maildir/
rm -fr /$newlocation/$newusername1fromusersfile/Maildir/.Trash
chown -R $newusername1fromusersfile:$domainusername /$newlocation/$newusername1fromusersfile/Maildir/

Repeat for each username combo….

—End “Pseudo Script :-)

Contents of “users”
oldusername1:newusername1
oldusername2:newusername2

UPDATE:

Thanks to the resident geniuses on the ILUG mailing list they have provided me with the script to complete this task. Here’s the script (1st part anyway)

Here’s the script:
====
#!/bin/sh
src=”00migrate” # a folder in the accounts home direcotry storing the accounts to be migrated
dst=”../”  # accounts home directory relative to $src
users=”../userlist.db” # flat file containing maps of old users to new in the form olduser:newuser
dom=”somedomain” # master account for the domain used to complete the username and group ownership

cd “$src”
tr : ‘ ‘ < “$users” | while read old new; do

mv $old/Maildir/cur “$dst”$new/Maildir/ && mv $old/Maildir/.* “$dst”$new/Maildir/ && rm -frv “$dst”$new/Maildir/.Trash/ && chown -R $new.”$dom”:”$dom” “$dst”$new/ && chown -R $new.”$dom”:”$dom” “$dst”$new/.*
done
===

Next I just need to edit the script to use rsync to copy the changes from the still running (but to be retired) mail server to the new one and then finally kill off the old server.