perl - 使用通配符移动文件

jda*_*mae 8 perl

是否可以使用模块中的perl move函数File::Copy来使用通配符来移动具有相同文件扩展名的多个公共文件?到目前为止,move如果我明确命名文件,我只能开始工作.

例如,我想做这样的事情:

my $old_loc = "/share/cust/abc/*.dat";
my $arc_dir = "/share/archive_dir/";
Run Code Online (Sandbox Code Playgroud)

现在,我可以像这样做一个文件:

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";
Run Code Online (Sandbox Code Playgroud)

我想在perl程序结束时做什么,将所有这些命名*.dat的文件移动到一个存档目录.

Pla*_*ure 11

您可以使用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";
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是不依赖于系统调用,这种调用是不可移植的,依赖于系统的,并且可能是危险的.


编辑:更好的方法是提供新目录而不是全新的文件名.(抱歉没想到这个!)

    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
Run Code Online (Sandbox Code Playgroud)


TLP*_*TLP 5

从 File::Copy文档

如果目标已经存在并且是一个目录,而源不是目录,那么源文件将被重命名到目标指定的目录中。

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 $!;
}
Run Code Online (Sandbox Code Playgroud)