如何让grep只扫描文件名中的前12个字符?

Zes*_*Rex 0 perl grep

我试图按文件名过滤文件.

系统会要求您输入两个日期,然后我的代码会遍历所有文件,并将符合搜索参数的所有文件写入数组.

但是,如果我输入一个不准确的范围,如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
Run Code Online (Sandbox Code Playgroud)

如何只grep文件名的前12个字符?

我想到了混合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 ) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 7

听起来您只想搜索每个文件名的前八个字符.这看起来像这样

my @files = grep { substr($_, 0, 8) =~ $daterange } readdir $dir_b;
Run Code Online (Sandbox Code Playgroud)

我更喜欢readdirwhile循环中使用,就像这样

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
    }
}
Run Code Online (Sandbox Code Playgroud)