如何使用Perl获取目录中的纯文件列表?

时间:2010-05-12 17:22:48

标签: perl

我正在寻找一种在Perl中列出目录的纯文件的方法。仅限文件,没有目录。

6 个答案:

答案 0 :(得分:11)

您需要将opendirreaddirclosedir函数与-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:

的文件glob
my @files = grep -f, <*>;

否则,您可以使用目录句柄:

opendir my $dh, $dirpath;

my @files = grep -f, readdir( $dh );

closedir $dh;

请参阅opendirreaddirclosedir-Xgrep

答案 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)

来自CPAN的

File::Find::Rule使得这完全无足轻重:

use File::Find::Rule;
my @files = File::Find::Rule->file->in( $directory );

这将查找给定目录或其任何子目录中的所有文件。我推荐这是因为它具有极高的灵活性和简单性。