O caminho aberto:
#!/usr/bin/perl
opendir(DIR,".") or die "$@:$!";
while ($in = readdir(DIR)) {
next unless -f $in;
($out = $in) =~ s/[^a-zA-Z0-9._-]//g;
warn "$@:$!" unless rename $in, $out;
}
closedir(DIR);
O regex filtra apenas a-zA-Z ... (também pode ser [: print:] para caracteres imprimíveis) como caracteres válidos. Não há verificação de nomes de alvos vazios.