是否可以使用move
模块中的perl File::Copy
函数来使用通配符移动具有相同文件扩展名的多个常用文件?
到目前为止,如果我明确命名文件,我只能使move
工作。
例如,我想做类似的事情:
my $old_loc = "/share/cust/abc/*.dat";
my $arc_dir = "/share/archive_dir/";
现在,我可以像这样做一个文件:
use strict;
use warnings;
use File::Copy;
my $old_loc = "/share/cust/abc/Mail_2011-10-17.dat";
my $arc_dir = "/share/archive_dir/Mail_2011-10-17.dat";
my $new_loc = $arc_dir;
#archive
print "Moving files to archive...\n";
move ($old_loc, $new_loc) || die "cound not move $old_loc to $new_loc: $!\n";
我想在perl程序结束时执行的操作,将名为*.dat
的所有文件移动到存档目录。
答案 0 :(得分:10)
您可以使用Perl的glob
运算符来获取需要打开的文件列表:
use strict;
use warnings;
use File::Copy;
my @old_files = glob "/share/cust/abc/*.dat";
my $arc_dir = "/share/archive_dir/";
foreach my $old_file (@old_files)
{
my ($short_file_name) = $old_file =~ m~/(.*?\.dat)$~;
my $new_file = $arc_dir . $short_file_name;
move($old_file, $new_file) or die "Could not move $old_file to $new_file: $!\n";
}
这样做的好处是不依赖于系统调用,这种调用是不可移植的,依赖于系统的,并且可能是危险的。
编辑:更好的方法是提供新目录而不是全新的文件名。 (很抱歉没想到这个!)
move($old_file, $arc_dir) or die "Could not move $old_file to $new_file: $!\n";
# Probably a good idea to make sure $arc_dir ends with a '/' character, just in case
答案 1 :(得分:4)
从文件::复制documentation:
如果目标已存在并且是目录和源 不是目录,那么源文件将被重命名为 目的地指定的目录。
use strict;
use warnings;
use File::Copy;
my $old_loc = "/share/cust/abc/*.dat";
my $arc_dir = "/share/archive_dir/";
for my $file (glob $old_loc) {
move ($file, $arc_dir) or die $!;
}
答案 2 :(得分:-2)
system功能可能会更好运(虽然你必须小心)。
print system("mv -v /share/cust/abc/*.dat /share/archive_dir/");