#!/usr/bin/perl =head1 Usage: rename-script [OPTIONS] PATH Options: -p Pattern to look for in file's name. Default '\s' -r Replacement string. Default '_' -n Don't use 'g' option modifier with pattern matching =cut use strict; use File::Spec; use File::Basename; use File::Find; use Getopt::Std; my %opts; getopts('np:r:', \%opts); my $path = shift @ARGV // die "need path argument.\n"; my $pat = $opts{p} // '\s'; my $rep = $opts{r} // '_'; my @found; die "bad pattern $pat\n" unless eval { "" =~ /$pat/; 1; }; find sub { unshift @found, $File::Find::name }, $path; for ( @found ) { my ($base,$dir) = (basename($_),dirname($_)); my $newbase; defined $opts{n} ? (($newbase = $base) =~ s/$pat/$rep/ ) : (($newbase = $base) =~ s/$pat/$rep/g ); if ( $newbase ne $base ) { my $newname = File::Spec->catfile($dir,$newbase); (-e $newname) and (warn("can't rename $_ to $newname: $newname already exists\n"),next) ; rename($_,$newname) or warn "can't rename $_ to $newname:$!\n"; } }