如何使用perl使用file :: find :: rule模块排除某些文件?

时间:2017-06-19 08:21:11

标签: perl

我曾尝试删除曾经用数字命名的文件,但是我的代码中没有这样做。这里的$ output是我的目录位置。其中目录包含多个文件夹和子文件夹。

从那个文件夹和子文件夹中我想选择我的.ml文件。其中只列出了名为.ml文件的aplhabets。

如果文件名如下(ev4.html,ev8.html等,则应省略)。

因为这里的文件名随数字一起出现,所以我想排除曾经用数字命名的文件并打印例外输出。

这是我的代码:

use strict;
use warnings;
use File::Find::Rule;
my $output="/home/location/radio/datas";
my @files=File::Find::Rule->file()
                ->name('*.ml')
                #->name(qr/\^ev\d+/)->prune->discard
                ->in($output);
for my $file(@files)
{
print "file:$file\n";
}

获得输出:

file:/dacr/dacr.ml
file:/DV/DV.ml
file:DV/ev4/ev4.ml

预期产出:

file:/dacr/dacr.ml
file:/DV/DV.ml

1 个答案:

答案 0 :(得分:1)

您的尝试几乎是正确的,但您的正则表达式是错误的,prunediscard将删除所有文件,而不仅仅是正则表达式的文件。

my @files=File::Find::Rule->file()
    ->name('*.ml')
    ->name(qr/\^ev\d+/) # wrong regex
    ->prune->discard    # throws away all files
    ->in($output);

获取包含任何数字的文件的正确正则表达式只是\d。您说的是文字^,字母ev和任意数量的数字,至少一个

要使File :: Find :: Rule获取以.ml结尾的所有文件,而不是具有数字的文件,请使用not

my @files=File::Find::Rule->file()
    ->name('*.ml')
    ->not( File::Find::Rule->name(qr/\d/) )
    ->in($output);

这将获取所有.ml个文件,并丢弃名称中包含任何数字的任何文件。