Category: Utilities
Author/Contact Info fundflow
Description: This script renames files safely and convinenty.

Safely means that no files will be lost in the process, so the worst you can do is to give the files new uniqe names. A detailed explanation is given in case something is wrong.

Convinently means that you can do things like:
  • DOS style: ren.pl .old .new *.old
  • Perl style: ren.pl 's/this/that/' *
  • Uppercase: ren.pl upper *


This script has been slowly evolving here and i thought others might like it.

It is a newer version of what i posted before, but as Anonymous so i can't update it...

All comments are welcome.

Enjoy
#!/usr/bin/perl -w

if (@ARGV<2) {
  print STDERR<<EOM;
  rename file names using perl substitution:
       rename .old .new *.old
       rename 'upper unless /^Make/' *
       rename 'lower unless /^Make/' *
       rename 'y/A-Z/a-z/ unless /^Make/' *     (same as above)
       rename 's/\.orig\$//' *.orig
       rename '\$_ .= ".bad"' *.f
       rename '\$_ .= "-t"' *
       rename 'print "\$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *
EOM
  exit(1);
}

$op = shift;
$op =~ s|lower|y/A-Z/a-z/|;
$op =~ s|upper|y/a-z/A-Z/|;

# Deal with 'ren.pl .old .new *'
if (! -f $ARGV[0]) {
    $op="s/$op/" . $ARGV[0] . "/";
}

for (@ARGV) {
    next if(! -e $_);
    $was = $_;
    eval $op;
    $newnames{$_}++;
    $moveto{$was} = $_;
}

# Make sure nothing will be lost:
$ok=1;
foreach (keys %moveto) {
    if ( $newnames{$moveto{$_}} > 1) {
    print STDERR "$_ --> $moveto{$_}: ",
        "multiple files ($newnames{$moveto{$_}}) would",
        " be renamed to $moveto{$_}\n";
    $ok=0;
    }
    next if ($_ eq $moveto{$_});
    if (-e $moveto{$_}) {
    print STDERR "$_ --> $moveto{$_}: file already exists.\n";
    $ok=0;
    }
}

exit 1 unless($ok);

foreach (keys %moveto) {
  next if ($_ eq $moveto{$_});
  print "Renaming $_ to $moveto{$_}\n";
  rename($_,$moveto{$_});
}