#!/usr/bin/perl

use strict;
use warnings;

my $recursive = ($ARGV[0] || '') eq '-r';
shift @ARGV if $recursive;
#emulate missing windows shell expansion
if (@ARGV == 1 and $ARGV[0] eq '*') {
	opendir DIR, ".";
	@ARGV = grep { !/^\.\.?$/ } (readdir DIR);
	closedir DIR;
}

number_files(@ARGV);

#recursively number the files of each directory
sub number_files {
	my @files_and_dirs = @_;
	my (@dirs, @files);
	
	foreach my $file (@files_and_dirs) {
		if (-d $file) { #dir
			push @dirs, $file;
		} elsif (-f $file) {
			push @files, $file;
		}
	}#for
	
	#number files
	my $i = 1;
	foreach my $file (sort @files) {
		$file =~ /^(.*?)([^\\\/]*)$/;
		my $new_file = ($1 || '') . sprintf("%03d - %s", $i++, $2);
		print "Renaming $file -> $new_file\n";
		rename $file, $new_file;
	}
	
	#recurse
	if ($recursive) {
		foreach my $dir (@dirs) {
			opendir DIR, $dir;
			my @dir = map "$dir/$_", grep { !/^\.\.?$/ } (readdir DIR);
			closedir DIR;
			number_files(@dir);
		}
	}
}
