如何Perl脚本将具有特定扩展名的文件从一个文件夹移动到另一个文件夹,并重命名移动的文件

时间:2012-09-07 06:14:31

标签: perl csv perl-module

我有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” 我如何纠正这个问题,然后重命名移动的文件...请告知..需要帮助

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

将过滤条件更改为\\.csv$

正则表达式中的

.表示任何字符和$强制它在字符串的末尾。

答案 2 :(得分:2)

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

mv dir1/*.csv dir2

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

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

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

您可能希望使用File :: Copy模块。有关详细信息,请参阅移动文档。

答案 3 :(得分:1)

这是另一种选择:

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

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

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

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

答案 4 :(得分: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...