【问题标题】:How to Perl script to move files with specific extension from one folder to another and rename the moved files如何使用 Perl 脚本将具有特定扩展名的文件从一个文件夹移动到另一个文件夹并重命名移动的文件
【发布时间】:2012-09-01 00:24:00
【问题描述】:

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

【问题讨论】:

  • 时间戳是文件修改时间还是重命名时间
  • @justintime...timestamp 应该是文件的修改时间...thnks

标签: perl csv perl-module


【解决方案1】:

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

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

【讨论】:

  • @bool.dev.thanks alot..如何用时间戳重新命名 dir1 中移动的文件...请帮助
  • @justintime...非常感谢..如何使用时间戳重新命名 dir1 中移动的文件...请帮助
【解决方案2】:

这是另一个选择:

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

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

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

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

【讨论】:

  • @friedo..thanks!!...我如何重命名这些在 dir2 中移动的附加时间戳
  • 使用POSIX::stat获取文件状态,包括修改时间。然后在你的 $cfile 中使用它
【解决方案3】:
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;

【讨论】:

  • @jwr..thanks alot......但这会将文件从 abc.csv 重命名为 abc.csv.20120907......我希望重命名像......abc_20120907t .csv ..你能帮忙吗..
【解决方案4】:

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

mv dir1/*.csv dir2

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

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

注意:未经测试,因为我使用的是移动设备。

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

【讨论】:

    【解决方案5】:
    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...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多