繁体   English   中英

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

[英]How to Perl script to move files with specific extension from one folder to another and rename the moved files

我有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”的文件。我该如何解决此问题,然后重命名已移动的文件...请咨询..需要帮助

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;

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

. 在正则表达式中表示任何字符,并且$强制将其放在字符串末尾。

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

mv dir1/*.csv dir2

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

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

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

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

这是另一个选择:

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

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

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

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

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...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM