如何检查文件是否存在并在perl中重命名

时间:2010-03-31 14:02:53

标签: perl

  

可能重复:   Renaming and Moving Files in Bash or Perl

我是perl的新手并且正在寻找一个可以处理文件移动的脚本。

#!/usr/bin/perl -w
$filename = 'DUMBFILE';
$destination = '/some/location/';
if (-e $destination + $filename) {
  print "File Exists ! Renaming ..";
  move ('/tmp/' + $filename, $destination + $filename + '.1');
} else {
  move ('/tmp/' + $filename, $destination + $filename);
}

我可以将它重命名为1,但我希望以递增方式重命名,就像file.1存在一样,重命名为.2,如果.2存在则.3。

编辑:并保持扩展名相同;像file.exe变成file.exe.1,file.exe.2等。

4 个答案:

答案 0 :(得分:4)

您需要连接.而不是+

if (-e $destination . $filename) {

甚至更好。您可以使用File::Spec模块:

use File::Spec;
...
if (-e File::Spec->join($destination, $filename)) {

use strict;

要移动文件,您可以使用File::Copy模块:

use File::Copy;
...
move($from, $to);

答案 1 :(得分:4)

你想要做的事情可能是:

use File::Copy;

sub construct_filename {
    my ($dir, $name, $counter) = @_;
    if ($name =~ /^(.*)\.(.*)$/) {
        return "$dir/$1.$counter.$2";
    } else {
        return "$dir/$name.$counter";
    }
}

if (-e "$destination$filename") {
    $counter = 1;
    while (-e construct_filename($destination,$filename,$counter)) {
        $counter++;
    }
    move("/tmp/$filename", construct_filename($destination,$filename,$counter));
} else {
    move("/tmp/$filename", "$destination$filename");
}

此外,perl中的字符串连接运算符为.,而不是+。你写的东西根本不起作用。在这种情况下,您可以使用双引号字符串插值,而不必使用连接。

对于它的价值,一个更简单的约定是目录永远不会包含尾部斜杠,并且在构造文件名时总是使用它们(例如"$destination/$filename")。正如其他人所指出的那样,建立路径的最有力方法是使用File::Spec。但是,据我所知,你真正想要的部分是如何进行增量命名;所以我给出了一个明确而简短的版本。根据需要升级到File::Spec

答案 2 :(得分:3)

#!/usr/bin/perl
use strict;
use warnings;

use File::Spec::Functions qw'catfile';
use File::Copy qw'move';
use autodie    qw'move';

my $filename    = 'DUMBFILE';
my $origin      = '/tmp';
my $destination = '/some/location';

my $path = catfile $destination, $filename;
{
  my $counter;
  while( -e $path ){
    $counter++;
    $path = catfile $destination, "$filename.$counter";
  }
}

move( catfile( $origin, $filename ), $path );

答案 3 :(得分:2)

#!/usr/bin/perl -w
$filename = 'DUMBFILE';
$destination = '/some/location/';
$filepath=$destination.$filename;
if (-e $filepath) {
  print "File Exists ! Renaming ..";
  $counter++;
  rename('/tmp/'.$filename.$filepath.$counter);
} else {
  move ('/tmp/'.$filename.$filepath);
}