Hello all. I couldn't find any utility out there to really quickly move all 
the current mail spools (we have well over 1500 users per machine) over to 
a hashed directory structure (the second type of hash, ie - 
"firstletter/secondletter/fullname"), so today I went ahead and wrote this 
quick script. Keep in mind that I make no guarantees other than that it 
worked great for me and helped out a LOT. Also be sure to stop POP and 
sendmail temporarily when you execute this. Hope this helps out some other 
people. At the very least it's a starting off point for your own script.

See ya.

-------------------------------------------------------------
#!/usr/local/bin/perl -w

#######################################################################
#
# This is a script to aid in the conversion from flat directories
# for email to hashed (type 2) directories
#
# Tim Meader - 2/25/02
#
#######################################################################


use strict;
#use diagnostics;
use File::Copy;

#####################################
#
# Tests for correct usage
#
#####################################

if(!$ARGV[0])
{
         print "Incorrect usage: \"hashconv [current user mailfile 
directory]\"\n";
         print "Exitting...\n";
         exit(1);
}

if(!(-e $ARGV[0]))
{
         print "The starting directory you specified does not exist!\n";
         print "Exitting...\n";
         exit(1);
}

if(!(-d $ARGV[0]))
{
         print "The name you entered is not a directory!\n";
         print "Exitting...\n";
         exit(1);
}

if(-l $ARGV[0])
{
         print "The name you entered is a symbolic link. Please enter the 
real directory name.\n";
         print "Exitting...\n";
         exit(1);
}

if($ARGV[0] !~ /\/$/)
{
         $ARGV[0] = $ARGV[0]."/";
}

my ($curr_dir) = `pwd`;
chomp $curr_dir;
$curr_dir = $curr_dir."/";

if($ARGV[0] eq $curr_dir)
{
         print "DO NOT RUN THIS PROGRAM FROM THE SAME DIRECTORY YOU 
SPECIFY!\n";
         print "Exitting...\n";
         exit(1);
}

######################################


my (@mboxlist) = `ls -1 $ARGV[0]`;
chomp @mboxlist;

foreach (@mboxlist)
{
         if(($_ !~ /\/$/) && !(-x $ARGV[0].$_) && ($_ ne $0))
         {
                 my ($first_letter) = substr($_, 0, 1);
                 my ($second_letter) = substr($_, 1, 1);

                 if(!(-e $ARGV[0].$first_letter))
                 {
                         mkdir $ARGV[0].$first_letter;
                         chmod 01777, "$ARGV[0]$first_letter";
                         mkdir $ARGV[0].$first_letter."/".$second_letter;
                         chmod 01777, 
"$ARGV[0]$first_letter"."/"."$second_letter";
                         system("chown", "-R", "root:mail", 
"$ARGV[0]$first_letter");
                         print "Created FULL path 
\"$ARGV[0]$first_letter"."/"."$second_letter\"\n";
                         move($ARGV[0].$_, 
$ARGV[0].$first_letter."/".$second_letter."/".$_);
                         print "Moved current mail file \"$_\" to 
\"$ARGV[0]$first_letter"."/"."$second_letter"."/"."$_\"\n\n";
                 }
                 elsif(!(-e $ARGV[0].$first_letter."/".$second_letter))
                 {
                         mkdir $ARGV[0].$first_letter."/".$second_letter;
                         chmod 01777, 
"$ARGV[0]$first_letter"."/"."$second_letter";
                         system("chown", "root:mail", 
"$ARGV[0]$first_letter"."/"."$second_letter");
                         print "Created path 
\"$ARGV[0]$first_letter"."/"."$second_letter\"\n";
                         move($ARGV[0].$_, 
$ARGV[0].$first_letter."/".$second_letter."/".$_);
                         print "Moved current mail file \"$_\" to 
\"$ARGV[0]$first_letter"."/"."$second_letter"."/"."$_\"\n\n";
                 }
                 elsif(-e $ARGV[0].$first_letter."/".$second_letter."/".$_)
                 {
                         open(ORIGMAIL, ">>$ARGV[0]$_");
                         flock(ORIGMAIL, 2);
                         open(NEWMAIL, 
"<$ARGV[0]$first_letter"."/"."$second_letter"."/"."$_");
                         flock(NEWMAIL, 2);

                         foreach my $newmailline (<NEWMAIL>)
                         {
                                 print ORIGMAIL "$newmailline\n";
                         }

                         close(NEWMAIL);
                         close(ORIGMAIL);

                         print "File 
\"$ARGV[0]$first_letter"."/"."$second_letter"."/"."$_\" catted to 
\"$ARGV[0]$_\"\n";
                         copy($ARGV[0].$_, 
$ARGV[0].$first_letter."/".$second_letter."/".$_);
                         print "Merged file copied!!\n\n";
                 }
                 else
                 {
                         move($ARGV[0].$_, 
$ARGV[0].$first_letter."/".$second_letter."/".$_);
                         print "ONLY moved current mail file \"$_\" to 
\"$ARGV[0]$first_letter"."/"."$second_letter"."/"."$_\"\n\n";
                 }
         }
}

exit(0);



---
Tim Meader
ACS-GSG - (301) 286-8013
[EMAIL PROTECTED]

Reply via email to