如何根据文件扩展名过滤文件名?

4
以下脚本将所有文件和目录存储在数组@file_list中。
如何仅筛选扩展名为.lt6的文件,而不包括其他文件?
opendir (CURRDIR, $localdir);
@file_list = grep !/^\.\.?$/, readdir CURRDIR;
print STDOUT "Found Files: @file_list\n";

干杯

7个回答

9

试试这个:

grep(/\.lt6$/i, readdir(CURRDIR))

我已经使用过它很多次。虽然它能运行,但现在我更喜欢使用File::Next来处理这种事情。
示例:
use File::Next;

my $iter = File::Next::files( { file_filter => sub { /\.lt6$/ } }, $localdir )

while ( defined ( my $file = $iter->() ) ) {
    print $file, "\n";
}

相当类似的答案 - 不区分大小写与区分、括号与不括号。 :D - Jonathan Leffler
我们几乎同时回答了问题。伟大的思想总是相似的8D。虽然在这种情况下,我想我是最快的枪手! - Jim Counts
是的 - 在回答之前编辑问题之前,我应该知道得更好:D - Jonathan Leffler

3

不要忘记使用closedir()

您的grep应该查找:

my(@file_list) = grep /\.lt6$/, readdir CURRDIR;

假设你的语法大致正确。

2
my @file_list = glob "$localdir/*.lt6";

2

您可以使用File::Find::Rule模块来实现此功能;

use File::Find::Rule;

print "FOUND:\n    "
    , join( "\n    "
          , File::Find::Rule->file->name( '*.lt6' )->in( $path )
          )
    , "\n"
    ;

这个还有递归下降的额外功能。如果你只想要顶层目录中的文件,那么使用这个功能就是一个强大的武器,但没有额外的好处。 - brian d foy
它的重量仅取决于文件列表的范围,该范围从描述中未指定。它避免了过程性的开-循环-关结构,而且我从来不喜欢opendir/closedir的单独语法。无论如何,它似乎都没有比sh的$(ls)更好。 - Axeman

1
opendir (CURRDIR, $localdir);
@file_list = grep m/\.lt6$/, readdir CURRDIR;
closedir CURRDIR;
print STDOUT "Found Files: @file_list\n";

如果你只通过以.lt6结尾的东西,那么你不需要检查.和.. :) - brian d foy

0

为了增加一些变化,你也可以做这样的事情:

opendir(DIR, $path) || die qq([ERROR] Cannot opendir "$path" - $!\n);
my(@txt) = grep(m{\.txt$}, readdir DIR);
rewinddir DIR;
my(@lt6) = grep(m{\.lt6$}, readdir DIR);
rewinddir DIR;
my(@dirs) = grep(-d "$path/$_", readdir DIR);
closedir DIR;

等等。


-1

打开命令提示符

cd \

dir /s *.lt6 > mydir.txt


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接