如何仅列出文件夹中的两个特定格式文件并将其打印到文本文件中

时间:2014-08-20 02:01:55

标签: perl

以下代码只能读取txt个文件,并将filenamesize打印到filename.txt

my $directory = 'c:\modules\SFTP';
my $file='filename.txt';
my $OUTFILE;

open $OUTFILE, '>>', $file;

my @files = do {
    opendir my $dh, $directory;
    grep {/^.*\.txt\z/si} readdir($dh);
};
foreach(@files){
 my $filesize = stat($_)->size;

  print { $OUTFILE } "$filesize $_" ,"\n";

}

我的问题是,无论如何要读取两个特定的文件格式文件而不是只有一个?

EG。文件夹A

textfile1.txt
textfile2.txt
testfile3.fcd

预期结果:

能够获取并打印出两个特定格式filename文件的size(.txt and .fcd),而不是仅打印一个(.txt)

我应该在代码中更改或添加什么内容才能获得预期的结果?任何相关的帖子或有用的资源分享?谢谢!

2 个答案:

答案 0 :(得分:1)

你已经完成了大部分工作。确保你在opendir附近有一些parens。 use warnings应该指出这一点。只需在grep添加其他模式即可。此外,在读取目录之后打开输出文件,您将在输出中列出输出文件。

use strict;
use warnings; 
use autodie;
use File::stat;

my $directory = 'c:\modules\SFTP';
my $file = 'filename.txt';

opendir (my $dh, $directory);
my @files = grep(/^.*\.(txt|fcd)\z/si, readdir $dh);

open my $OUTFILE, '>', $file;

foreach(@files){
    my $filesize = stat($_)->size;
    print $OUTFILE "$filesize $_" ,"\n";
}

答案 1 :(得分:1)

如前所述,您需要根据多个扩展程序进行过滤,只需在正则表达式中设置更改:

/\.(?:txt|fcd)$/i

请注意,我已经简化了你的正则表达式,因为没有必要匹配文件名的开头。

使用Path :: Class

进行增强

我建议您查看Path::Class以便更轻松地进行文件和路径操作。

以下内容与您的脚本相同,但确保您在文件测试中没有丢失路径信息:

use strict;
use warnings;
use autodie;

use Path::Class;

my $dir = dir('c:\modules\SFTP');

open my $outfh, '>>', 'filename.txt';

while (my $file = $dir->next) {
    next unless $file =~ /\.(?:txt|fcd)$/;
    printf $outfh "%s %s\n", $file->stat->size, $file->basename;
}