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

Dav*_*d B 12 directory perl

我经常使用类似的东西

my $dir="/path/to/dir";
opendir(DIR, $dir) or die "can't open $dir: $!";
my @files = readdir DIR;
closedir DIR;
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ung 14

my @files = grep {!/^\./} readdir DIR;
Run Code Online (Sandbox Code Playgroud)

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


FMc*_*FMc 8

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

use File::Slurp qw(read_dir);

my $dir = '/path/to/dir';
my @contents = read_dir($dir);
Run Code Online (Sandbox Code Playgroud)

另一个有用的模块是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' );
Run Code Online (Sandbox Code Playgroud)


mob*_*mob 7

如果某些dotfiles很重要,

my @files = grep !/^\.\.?$/, readdir DIR;
Run Code Online (Sandbox Code Playgroud)

只会排除...

  • 好吧,它可能排除".. \n",这在Unix中是合法的.并不是说我希望任何人都能使用这个文件名,但人们会做一些奇怪的事情,看看有人会忽略他们偷偷进入你的目录的文件.您可以使用\ z而不是$ :)来解决这个问题. (4认同)

Cha*_*ens 7

我通常会使用这个glob方法:

for my $file (glob "$dir/*") {
    #do stuff with $file
}
Run Code Online (Sandbox Code Playgroud)

除非目录中包含大量文件,否则这样可以正常工作.在那些你必须切换回的情况下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
}
Run Code Online (Sandbox Code Playgroud)

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

use File::Find;

find sub {
    return if /^[.]/;
    #do stuff with $_ or $File::Find::name
}, $dir;
Run Code Online (Sandbox Code Playgroud)


Eth*_*her 5

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

my @files = grep { -f } readdir $dir;
Run Code Online (Sandbox Code Playgroud)

  • 仅当目录句柄用于当前目录时,这才有效。 (6认同)