#!/usr/local/bin/perl use warnings; use strict; use File::Copy qw/mv/; sub get_og_files { my @og_files; opendir(DIR, '.') or die $!; while (readdir(DIR)) { next if ($_ =~ m/^\./); push @og_files, $_; } closedir(DIR); return @og_files; } sub get_new_files { my @og_files = @_; my @new_files; foreach (@og_files) { $_ =~ s/\ -\ /-_/g; $_ =~ s/\_-\_/-_/g; $_ =~ s/['"]+/_/g; $_ =~ s/\ /_/g; $_ =~ s/[\$#@~!&*%()\[\];,:?^`\\\/<>|]+/-/g; $_ = lc($_); push @new_files, $_; } return @new_files; } sub main { my @og_files; my @new_files; my @files; @og_files = get_og_files(); @new_files = get_new_files(@og_files); while (@og_files || @new_files) { $files[0] = shift @og_files; $files[1] = shift @new_files; if (@ARGV == 1 && $ARGV[0] eq '-R' && -d $files[0]) { chdir($files[0]) or die $!; main(); chdir('../'); } next if (-e $files[1]); mv($files[0], $files[1]) or print STDERR $! . "\n"; print "'". $files[0] . "' -> '" . $files[1] . "'\n"; } return; } main(); __END__