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 ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.