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 に答える