in reply to rename files using regex.

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

Replies are listed 'Best First'.
Re: Re: rename files using regex.
by parv (Parson) on Jul 24, 2003 at 18:38 UTC

    Thanks bsb for pointing out the Convert::Translit::transliterate(). Now, only if the first locale could be guessed given some text...