我正在尝试按文件名过滤文件。
系统会要求您输入两个日期,然后我的代码会遍历所有文件,并将符合搜索参数的所有文件写入数组。
但是如果我输入一个不准确的范围,比如2014 .. 2016,那么与我的搜索无关的文件(因为我只想将前8个字符作为代表日期戳的grep)就像前两个文件一样@files
也会被过滤,因为它们的名称中包含2014年,2015年或2016年。
@files = 20120830_600020143_1_Log.csv (wrong because year 2012)
20130830_600020161_1_Log.csv (wrong because year 2013)
20150830_600020162_1_Log.csv
20160830_600020121_1_Log.csv
如何只对文件名的前12个字符进行grep?
我想到了与substr
的混合,但无法让它发挥作用。
这是我需要改变的代码。在这种情况下,$daterange
为"2016"
foreach $folder ( @folder ) {
$curdir = "$scriptdir\\$folder";
opendir my $dir_b, "$curdir" or die "Can't open directory: $!";
my @files = grep { /$daterange/ } readdir $dir_b;
closedir $dir_b;
foreach $files ( @files ) {
...
}
答案 0 :(得分:7)
听起来您只想搜索每个文件名的前八个字符。这看起来像这样
my @files = grep { substr($_, 0, 8) =~ $daterange } readdir $dir_b;
我更喜欢在readdir
循环中使用while
,就像这样
foreach $folder ( @folder ) {
my $curdir = "$scriptdir\\$folder";
opendir my $dh, $curdir or die qq{Unable to open directory "$curdir": $!};
while ( my $node = readdir $dh ) {
next if $node eq '.' or $node eq '..';
next unless substr($node, 0, 8) =~ $daterange;
my $fn = "$curdir\\$node";
next unless -f $fn;
# Do stuff with $fn
}
}