Renaming Files
Giving an existing file a new name is simple with the rename
function:
rename "old", "new";
This is similar to the Unix mv
command, taking a file named old
and giving it the name new
in the same directory. You can even move things around:
rename "over_there/some/place/some_file", "some_file";
This moves a file called some_file
from another directory into the current directory, provided the user running the program has the appropriate permissions.[282] Like most functions that request something of the operating system, rename
returns false if it fails, and sets $!
with the operating system error, so you can (and often should) use or die
(or or warn
) to report this to the user.
One frequent[283] question in the Unix shell-usage newsgroups is how to rename everything that ends with .old to the same name with .new. Here’s how to do it in Perl:
foreach my $file (glob "*.old") { my $newfile = $file; $newfile =~ s/\.old$/.new/; if (-e $newfile) { warn "can't rename $file to $newfile: $newfile exists\n"; } elsif (rename $file, $newfile) { ## success, do nothing } else { warn "rename $file to $newfile failed: $!\n"; } }
The check for the existence of $newfile
is needed because rename
will rename a file right over the top of an existing file, presuming the user has permission to remove the destination filename. We put the check in so that it’s less likely that we’ll lose information this way. If you wanted to replace existing files, like wilma.new
, you wouldn’t bother testing with ...
Get Learning Perl, Fourth Edition 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.