Renaming Files
Problem
You have a lot of files whose names you want to change.
Solution
Use a foreach loop and the
rename function:
foreach $file (@NAMES) {
my $newname = $file;
# change $newname
rename($file, $newname) or
warn "Couldn't rename $file to $newname: $!\n";
}Discussion
This is straightforward. rename takes two
arguments. The first is the filename to change, and the second is its
new name. Perl’s rename is a front end to
the operating system’s rename system call, which typically
won’t let you rename files across filesystem boundaries.
A small change turns this into a generic
rename
script, such as the one by Larry Wall
shown in Example 9.5.
Example 9-5. rename
#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}This script’s first argument is Perl code that alters the
filename (stored in $_) to reflect how you want
the file renamed. It can do this because it uses an
eval to do the hard work. It also skips
rename calls when the filename is untouched. This
lets you simply use wildcards like rename
EXPR
* instead of making long
lists of filenames.
Here are five examples of calling the rename program from your shell:
% rename 's/\.orig$//' *.orig % rename 'tr/A-Z/a-z/ unless /^Make/' * % rename '$_ .= ".bad"' *.f % rename 'print "$_: "; s/foo/bar/ if <STDIN> =~ /^y/i' * % find /tmp -name '*~' -print | rename ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access