以下代码只能读取txt
个文件,并将filename
和size
打印到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)
我应该在代码中更改或添加什么内容才能获得预期的结果?任何相关的帖子或有用的资源分享?谢谢!
答案 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
以便更轻松地进行文件和路径操作。
以下内容与您的脚本相同,但确保您在文件测试中没有丢失路径信息:
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;
}