renx.btm, extended rename

  • This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.
#1
Some of the users here may find this batch file helpful:

Code:
@echo off
:: filename: renx.btm
::   author: Eric Pement
::     Date: Dec. 19, 2003
::   Credit: Tom Christiansen and Nathan Torkington, "Perl Cookbook" (1998), p. 327
switch "%1"
case "" .OR. "-?" .OR. "-h" .OR. "--help"
  goto syntax
default
  if not exist "c:\bat\lib\renx.pl" (echo File c:\bat\lib\renx.pl not found! %+quit)

  :: Let perl process all the filename globbing and all the switches.
  perl c:\bat\lib\renx.pl %$
endswitch
goto end

:syntax
TEXT
renX - extended rename, a Perl file renamer
       Show "renaming OldName -> NewName" and total # of files renamed

Syntax:
   renx [-options] "script" [files morefiles* ...]

Options:
   -n    Do Nothing. Show what the results would be if files were renamed
   -q    Quiet mode. Do not display any results to the console
   -v    Verbose. Display renaming results and command-line arguments
  -h,-?  Display this help message

Examples:
   renx -q "s/\.orig$//" *.orig         # cut trailing extension quietly
   renx "tr/A-Z/a-z/ unless /^Make/" *  # convert to lowercase except ...
   renx "$_ .= '.bad'" *.f              # append .bad to each file named
   renx "s/^(.+)~$/.#$1/" *             # del trailing ~ and prepend '.#'

ENDTEXT
:end
The file "renx.pl" that it calls is below . . .

Code:
# filename: renx.pl - Larry Wall's filename fixer
#   author: Eric Pement
#     date: 2004-09-24
# modified: 2005-08-15
#
# Originally written by Larry Wall. Basic script in Tom Christiansen and
# Nathan Torkington, "Perl Cookbook" (1998), p. 327, to rename files.
# I expanded it to work on a DOS/Windows filesystem, and to support quiet
# and verbose option switches, and totals of files changed. -- ENP.
#
use strict;
use warnings;
use diagnostics;

use Getopt::Std;
use File::DosGlob 'glob';

our($opt_n,$opt_q,$opt_v);
getopts('nqv');
# Foreach character X in the set (nqv), assign $opt_X to 1.
# -n       = Do nothing. Don't rename, but show results of proposed action.
# -q       = Quiet mode. Do not display any results to the console.
# -v       = Verbose. Display renaming prompt and command-line arguments.
# default  = display "renaming OldName -> NewName" and total files renamed.

my $op = shift or die `renx --help`;   # print help msg from 4DOS parent file

print "Verbose output:\n"                 if $opt_v;
print "  \$op is        [$op]\n"          if $opt_v;

# create @ARGV from stdin, if necessary
chomp(@ARGV = <STDIN>) unless @ARGV;

# expand the command tail, which may look like "s*.*,*.htm,*.h"
my @filelist  = glob("@ARGV");

# remove duplicate files from filelist
my %uniquefiles = ();
foreach my $file (@filelist){
   $uniquefiles{$file}++;
}

# revise @filelist to contain only unique, valid filenames
my @uniqfilz = sort keys %uniquefiles;
print "  \@ARGV is      [@ARGV]\n"        if $opt_v;
print "  \@filelist is  [@filelist]\n"    if $opt_v;
print "  \@uniqfilz is  [@uniqfilz]\n\n"  if $opt_v;

# get the longest filename:
my $longest = 0;
for (@uniqfilz) {
   $longest = length($_) if length($_) > $longest;
}

# Finally! rename the files, printing the changes unless quelled by -q
# or unless modified by -n
my $sum = 0;
for (@uniqfilz) {
   my $was = $_;
   eval $op;
   die $@ if $@;
   unless ($was eq $_) {
      printf("renaming %-*s  ->  %s\n", $longest, $was, $_) unless $opt_q;
      rename($was,$_) unless $opt_n;
      $sum++;
   }
}
print "Total of $sum file" . ($sum==1 ? "" : "s")
      . ($opt_n ? " would be" : "" ) . " renamed.\n"   unless $opt_q;
print "No files were renamed.\n"                      if $opt_n;
#---end of script---
Hope someone finds this useful !

Eric