#!/usr/bin/perl -w use strict; my $oldqueue = shift; my $newqueue = shift; $|++; &main; sub move { my ($from, $to, $user, $group, $mode) = @_; die "target exists ($to)" if ( -e $to ); system("mv", $from, $to) == 0 or die "mv failure from ($from) to ($to)"; system("chown", "$user:$group", $to) == 0 or die "chown failure on ($to)" if ( defined $user or defined $group ); system("chmod", $mode, $to) == 0 or die "chmod failure on ($to)" if ( defined $mode ); } sub move_cond { move(@_) if ( -e $_[0] ); } sub main { my @messages = map { m|/mess/(\d+)/(\d+)$| or die "unable to parse"; [$1, $2] } glob("$oldqueue/mess/*/*"); #print join "", map {"$_->[0] $_->[1]\n"} @messages; print "no messages to move\n" if ( not @messages );; foreach my $message ( @messages ) { my ($oldhash, $oldnum) = @$message; print "moving message $oldnum\n"; my $tmpfilename = "$newqueue/mess/new-message-$oldhash-$oldnum-$$"; move("$oldqueue/mess/$oldhash/$oldnum", $tmpfilename); my $newnum = ( stat($tmpfilename) )[1]; my $newhash = $newnum % 23; move($tmpfilename, "$newqueue/mess/$newhash/$newnum", "qmailq", "qmail", "0644"); move("$oldqueue/info/$oldhash/$oldnum", "$newqueue/info/$newhash/$newnum", "qmails", "qmail", "0600"); move_cond("$oldqueue/local/$oldhash/$oldnum", "$newqueue/local/$newhash/$newnum", "qmails", "qmail", "0600"); move_cond("$oldqueue/remote/$oldhash/$oldnum", "$newqueue/remote/$newhash/$newnum", "qmails", "qmail", "0600"); move_cond("$oldqueue/bounce/$oldnum", "$newqueue/bounce/$newnum", "qmails", "qmail", "0600"); move_cond("$oldqueue/todo/$oldnum", "$newqueue/todo/$newnum", "qmailq", "qmail", "0640"); } } #cd /var/qmail || exit 1 #find queue.old/mess -type f -printf '%f %i\n' | # awk '{print $1, $1%23, $2, $2%23}' | # while read oldi oldd newi newd; do # mv queue.old/mess/$oldd/$oldi queue/mess/$newd/$newi # mv queue.old/info/$oldd/$oldi queue/info/$newd/$newi # test -f queue.old/local/$oldd/$oldi && # mv queue.old/local/$oldd/$oldi queue/local/$newd/$newi # test -f queue.old/remote/$oldd/$oldi && # mv queue.old/remote/$oldd/$oldi queue/remote/$newd/$newi # test -f queue.old/bounce/$oldi && # mv queue.old/bounce/$oldi queue/bounce/$newi # test -f queue.old/todo/$oldi && # mv queue.old/todo/$oldi queue/todo/$newi # done