I tried using rename to clean up file names
but my expression outgrew the command line (not to mention
the difficulty of escaping everything). I ended up
hacking /usr/bin/rename.
Here it is, for what it's worth:
#!/usr/bin/perl -s
# bsb hacked version of /usr/bin/rename
use strict;
use vars qw($q $n $t);
use Convert::Translit;
# Quiet, do Nothing, Test
$q=$q; $n=$n; $t=$t;
my $trans = Convert::Translit->new('Latin1' => 'ascii');
if ($t) {
$n=1;
@ARGV = <DATA>;
}
if (!@ARGV) {
print "reading filenames from STDIN\n" unless $q;
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV) {
my $was = $_;
$_ = $trans->transliterate($_);
$_=lc;
s/&/ and /g;
s/\+/ plus /g;
s/'//g;
y/()~/---/s;
print if $t;
s/(?:(\.)|(-)|[\W_])+/$1||$2||'_'/ge;
s/^[._-]//;
s/[._-]$//;
die $@ if $@;
if( $was eq $_ ) { } # ignore quietly
elsif( -e $_ ) { warn "$was not renamed: $_ already exists\n
+"; }
elsif($n || rename($was,$_)) { print "$was renamed as $_\n" unless
+ $q; }
else { warn "Can't rename $was $_: $!\n"; }
}
Brad
|