1

我有 2 个文件夹 DIR1 DIR2,我只需要将扩展​​名为“.csv”的文件从 dir1 移动到 dir2

并使用 dir2 中的时间戳重命名这些文件复制的文件

$dirname = "\\dir1\\"
$dirname2= "\\dir2\\";
$filterstring=".csv";
opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
foreach my $filename (readdir(DIR))
{
      if ($filename =~ m/$filterstring/) {                          
$cfile=$dirname.$filename;
print "\n moving $cfile from $dirname  to $dirname2 \n";
move($cfile,$dirname2);                             
           }}
closedir(DIR);

我开发的上述代码移动了扩展名为“.csv”的文件以及文件名“abc_csv_uv.txt”的文件我如何纠正这个问题,然后重命名移动的文件...请告知..需要帮助

4

5 回答 5

4
use strict;
use File::Copy;
use File::stat;
use POSIX qw(strftime);

my $dirname = "\\dir1\\";
my $dirname2 = "\\dir2\\";
my $filterstring = "\\.csv\$";

opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
foreach my $filename (readdir(DIR)) {
    next if not $filename =~ m/$filterstring/;

    my $old_file = $dirname . $filename;
    my $new_file = $dirname2 . $filename . '.' . strftime("%Y%m%dT%H%M%S", localtime(stat($old_file)->mtime));

    print "Moving $old_file to $new_file\n";
    move($old_file, $new_file);
}
closedir(DIR);

1;
于 2012-09-07T07:10:49.503 回答
2

我认为这是在 Windows 中完成的。否则你可以做

mv dir1/*.csv dir2

您可以以类似的方式使用 perl 的 glob

for my $file (glob "dir1/*.csv") {
    move $file, "dir2" or die $!;
}

注意:未经测试,因为我在移动设备上。

您可能希望改用 File::Copy 模块。有关更多信息,请参阅 move 文档。

于 2012-09-07T07:14:30.043 回答
2

将过滤器更改为\\.csv$

.在正则表达式中表示任何字符,$ 强制它位于字符串的末尾。

于 2012-09-07T06:19:17.610 回答
1

这是另一种选择:

foreach my $filename (grep /\Q$filterstring\E$/, readdir(DIR)){

grep将只允许您的 .csv 文件从读取的目录中传递。接下来,删除条件:

if ($filename =~ m/$filterstring/) {

因为grep将处理文件名过滤。

于 2012-09-07T06:33:34.093 回答
0
use strict;
use File::Copy;
use File::stat; 

use POSIX qw(strftime); 

my $dirname = "\\dir\\";

my $dirname2 = "\\dir1\\"; 

my $filterstring = "\\.csv"; 

opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";

foreach my $filename (readdir(DIR)) {

if ($filename =~ m/$filterstring/)

 my $len=length($filename);

my $v=$len-4;

my $str=substr $filename, 0, $v; 

my $old_file = $dirname . $filename;   

my $new_file = $dirname2 . $str . '_' . strftime("%Y%m%d", localtime(stat($old_file)->mtime)).'.'.'csv'; 

print " $new_file\n"; 

copy($old_file, $new_file);

}

} closedir(DIR); 


i modfied and This works!!


thanks all...
于 2012-09-07T08:42:34.607 回答