我正在寻找一种在Perl中列出目录的纯文件的方法。仅限文件,没有目录。
答案 0 :(得分:11)
您需要将opendir
,readdir
和closedir
函数与-f
文件测试运算符结合使用:
opendir(my $dh, $some_dir) || die $!;
while(my $f = readdir $dh) {
next unless (-f "$some_dir/$f");
print "$some_dir/$f\n";
}
closedir $dh;
答案 1 :(得分:5)
列出目录中所有文件的另一种方法是使用CPAN模块File::Slurp中的read_dir
函数:
use strict;
use warnings;
use File::Slurp qw(read_dir);
my $dir = './';
my @files = grep { -f } read_dir($dir);
它会为您执行opendir检查。请记住,它包含任何“隐藏”文件(以点开头的文件)。这不会递归列出指定目录的子目录中的文件。
答案 2 :(得分:3)
您可以使用文件测试“operator”(实际上是一个函数)来检查您想要的文件类型。
在想要扫描当前目录的简单情况下,使用带有grep:
的文件globmy @files = grep -f, <*>;
否则,您可以使用目录句柄:
opendir my $dh, $dirpath;
my @files = grep -f, readdir( $dh );
closedir $dh;
答案 3 :(得分:2)
使用File::Find。这是一个核心模块。
use File::Find;
find(\&wanted, @directories_to_search);
sub wanted
{
my $file = shift;
return unless (-f $file);
#process file
}
答案 4 :(得分:1)
您想要readdir
运营商。
例如:
#! /usr/bin/perl
use warnings;
use strict;
my $dir = "/tmp/foo";
opendir my $dh, $dir
or die "$0: opendir: $!";
while (defined(my $name = readdir $dh)) {
next unless -f "$dir/$name";
print "$name\n";
}
运行它:
$ ls -F /tmp/foo a b c d/ $ ./prog.pl b c a
正如您所看到的,这些名称按照它们物理存储在文件系统中的顺序出现,不一定要排序。
要使用快速而肮脏的路线,您还可以使用
中的glob运算符print map { s!^.*/!!; "$_\n" }
grep !-d $_ =>
</tmp/foo/*>;
请注意,您必须从结果中删除目录,并且glob运算符不会返回名称以点开头的文件。
答案 5 :(得分:1)
File::Find::Rule使得这完全无足轻重:
use File::Find::Rule;
my @files = File::Find::Rule->file->in( $directory );
这将查找给定目录或其任何子目录中的所有文件。我推荐这是因为它具有极高的灵活性和简单性。