如何在perl中验证具有给定文件扩展名的多个文件

Posted

技术标签:

【中文标题】如何在perl中验证具有给定文件扩展名的多个文件【英文标题】:How to verify more than 1 file exist with a given file extension in perl 【发布时间】:2015-08-01 05:25:06 【问题描述】:

我的要求是知道一个目录中是否至少有2个.wav文件。

目前我正在使用grep(/\.wav$/,readdir($dir))获取.wav文件的数量,然后检查它是否存在greater than 1

但如果有1000s 个文件,我真的不想计算所有文件。

任何人都有更好的解决方案...

谢谢你:)

【问题讨论】:

【参考方案1】:

在标量上下文中,您可以使用while() 遍历目录项,并在满足您的条件时立即中断循环,

my $count = 0;
while (defined(my $f = readdir $dir)) 
    if ($f =~ /\.wav$/ and ++$count >= 2) 
      print "there are at least two wav files\n";
      last;
    

【讨论】:

谢谢 Сухой27。更好的解决方案:)【参考方案2】:

您可以使用glob 来扩展带有通配符的目录中的文件列表,或者更好的是来自包File::Globbsd_glob

use File::Glob ':bsd_glob';
my @wavfiles = bsd_glob("$your_directory/*.wav");
my $count_wavs = @wavfiles;

请注意,文件计数是在标量上下文中使用数组。

bsd_glob 更好,因为它可以正确处理目录名称中的空格(以及其他),在glob 上更喜欢这个。

【讨论】:

但它仍然计算所有文件。为什么要统计所有文件,看是否至少有2个文件。 如果有许多具有请求扩展名的文件,通配符可能会很慢,否则会很快。与公认的解决方案相比,如果你的目录中包含 zz.wav 和 zzz.wav 等许多文件,那么函数可能会相当长。除了这一点,我觉得用起来还是很简单的。

以上是关于如何在perl中验证具有给定文件扩展名的多个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让 perl 正确传递具有多个参数和复杂文件路径(空格和符号)的命令行参数?

如何获取给定文件夹中具有特定扩展名的文件列表?

如何获取给定文件夹中具有特定扩展名的文件列表?

检查目录是不是包含具有给定扩展名的文件

Perl:在多个文本文件中查找和替换特定字符串

具有多个参数的 Perl 系统命令输出到文件