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]