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.