【问题标题】:How to exclude some files using file::find::rule module using perl?如何使用 perl 使用 file::find::rule 模块排除某些文件?
【发布时间】:2017-06-19 17:14:44
【问题描述】:

我曾尝试删除与数字一起命名的文件,但在我的代码中没有发生。这里 $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

【问题讨论】:

  • 您的代码缺少$output 变量。你在谈论数字,但唯一与数字稍微相关的东西被注释掉了。请edit 并更具体地说明您想要做什么。
  • 你的英语很难懂。是谷歌翻译的吗?我认为您的意思是:不要在名称中包含带有数字的文件。对吗?
  • 注释代码中的正则表达式错误。我会写一个答案。
  • 是的,你是对的@simbabque
  • prune 正在丢弃所有内容。给我几分钟。

标签: perl


【解决方案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 文件,并丢弃名称中包含任何数字的任何文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多