如何使用Perl列出目录中的所有文件?

时间:2010-09-22 17:33:10

标签: perl directory

我通常使用像

这样的东西
my $dir="/path/to/dir";
opendir(DIR, $dir) or die "can't open $dir: $!";
my @files = readdir DIR;
closedir DIR;

或有时我使用glob,但无论如何,我总是需要添加一行或两行来过滤...,这非常烦人。 你通常如何处理这项共同任务?

6 个答案:

答案 0 :(得分:14)

my @files = grep {!/^\./} readdir DIR;

这也将排除所有的dotfiles,但这通常是你想要的。

答案 1 :(得分:8)

我经常使用File::Slurp。好处包括:(1)如果目录不存在则自动死亡。 (2)默认情况下排除...。它的行为类似于readdir,因为它不会返回完整路径。

use File::Slurp qw(read_dir);

my $dir = '/path/to/dir';
my @contents = read_dir($dir);

另一个有用的模块是File::Util,它在读取目录时提供了许多选项。例如:

use File::Util;
my $dir = '/path/to/dir';
my $fu = File::Util->new;
my @contents = $fu->list_dir( $dir, '--with-paths', '--no-fsdots' );

答案 2 :(得分:7)

如果某些点文件很重要,

my @files = grep !/^\.\.?$/, readdir DIR;

只会排除...

答案 3 :(得分:7)

我通常会使用glob方法:

for my $file (glob "$dir/*") {
    #do stuff with $file
}

除非目录中包含大量文件,否则这样可以正常工作。在这种情况下,您必须在readdir循环中切换回while(将readdir放在列表上下文中与glob一样糟糕:

open my $dh, $dir
    or die "could not open $dir: $!";

while (my $file = readdir $dh) {
    next if $file =~ /^[.]/;
    #do stuff with $file
}

通常,如果我正在读取目录中的一堆文件,我想以递归方式阅读它们。在这些情况下,我使用File::Find

use File::Find;

find sub {
    return if /^[.]/;
    #do stuff with $_ or $File::Find::name
}, $dir;

答案 4 :(得分:2)

当我只想要文件(而不是目录)时,我使用grep进行-f测试:

my @files = grep { -f } readdir $dir;

答案 5 :(得分:0)

感谢Chris和Ether的建议。我使用以下内容从引用当前目录以外的目录的目录句柄中读取所有文件(排除目录)的列表到数组中。不使用grep语句中的绝对路径时,数组总是缺少一个文件

use File::Slurp; 

print "\nWhich folder do you want to replace text? " ;
chomp (my $input = <>);
if ($input eq "") {
print "\nNo folder entered exiting program!!!\n";
exit 0;
} 

opendir(my $dh, $input) or die "\nUnable to access directory $input!!!\n"; 

my @dir = grep { -f "$input\\$_" } readdir $dh;