Index: trunk/tools/shorten-filenames-8.3.bat
===================================================================
--- trunk/tools/shorten-filenames-8.3.bat	(revision 1164)
+++ trunk/tools/shorten-filenames-8.3.bat	(revision 1164)
@@ -0,0 +1,1 @@
+perl shorten-filenames.pl 8 ../asma
Index: trunk/tools/shorten-filenames.pl
===================================================================
--- trunk/tools/shorten-filenames.pl	(revision 1164)
+++ trunk/tools/shorten-filenames.pl	(revision 1164)
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+use strict;
+
+my $n;
+
+sub process_dir($) {
+	my ($d) = @_;
+	opendir my $h, $d or die "$d: $!\n";
+	my @e = sort grep !/^\./, readdir $h;
+	closedir $h;
+	my %h;
+	if (@e > 64) {
+		printf "%s: %d entries\n", $d, scalar @e;
+	}
+	for my $e (@e) {
+		my $l = "$d/$e";
+		my $s = uc $e;
+		$s =~ y/-_//d;
+		my ($f, $x) = $s =~ /^([0-9A-Z]+)(\.[0-9A-Z]+)?$/ or die "$l: illegal filename\n";
+		$f = substr($f, 0, $n);
+		my $c = 1;
+		while ($h{$f.$x}++) {
+			++$c;
+			$f = substr($f, 0, $n - length($c)) . $c;
+		}
+		printf "%-*s%-5s%s\n", $n, $f, $x, $l;
+		if (-d $l) {
+			process_dir($l);
+		}
+	}
+}
+
+if (@ARGV != 2 || $ARGV[0] !~ /^\d\d?$/) {
+	die "Usage: perl shorten-filenames.pl NUMCHARS DIR\n";
+}
+$n = $ARGV[0];
+process_dir($ARGV[1]);
