我是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等。
答案 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);
}