#!/usr/bin/perl

# Moves all items in given directories to a given destination.
# Destination directory given first; source directories follow.
# Intended to solve the "Argument list too long" problem when
# moving lots of messages in an archive.

########################################################################
# imports

use strict;
use warnings;
use English qw( -no_match_vars );
use autodie qw( :all );
use 5.012; # so readdir assigns to $_ in a lone while test

########################################################################
# main program

my $dirs = 0;
my $files = 0;

die "specify destination directory" unless (@ARGV > 1);
my $destdir = shift @ARGV;

die "specify source directory/ies" unless (@ARGV);

die "bad destination: $destdir" unless -d $destdir;

DIR: for my $dirname (@ARGV) {

	opendir (my $dir, $dirname);

	$dirs++;

	FILE: while (readdir $dir) {

		die  "bogus readdir" if not defined $_;

		# skip the Unix directory glue
		next FILE if ($_ eq '.') or ($_ eq '..');

		$files++;

		my $srcfile = $dirname . '/' . $_;
		my $dstfile = $destdir . '/' . $_;

		die "destination exists: $dstfile" if -e $dstfile;

		rename $srcfile, $dstfile;
		
		} # FILE

	closedir $dir;
	
	} # DIR

say "moved $files files in $dirs directories"
