如何从特定目录中获取具有特定扩展名的所有文件的列表?

时间:2009-10-02 15:36:20

标签: perl directory

我正在使用此代码获取特定目录中所有文件的列表:

opendir DIR, $dir or die "cannot open dir $dir: $!";
my @files= readdir DIR;
closedir DIR;

如何修改此代码或向其添加内容以便它只查找文本文件并仅加载带有文件名前缀的数组?

示例目录内容:

.
..
923847.txt
98398523.txt
198.txt
deisi.jpg
oisoifs.gif
lksdjl.exe

示例数组内容:

files[0]=923847 
files[1]=98398523
files[2]=198

6 个答案:

答案 0 :(得分:11)

my @files = glob "$dir/*.txt";
for (0..$#files){
  $files[$_] =~ s/\.txt$//;
}

答案 1 :(得分:5)

改变一行就足够了:

my @files= map{s/\.[^.]+$//;$_}grep {/\.txt$/} readdir DIR;

答案 2 :(得分:3)

如果您可以使用Perl 5.10的新功能,我就是这样写的。

use strict;
use warnings;
use 5.10.1;
use autodie; # don't need to check the output of opendir now

my $dir = ".";

{
  opendir my($dirhandle), $dir;
  for( readdir $dirhandle ){ # sets $_
    when(-d $_ ){ next } # skip directories
    when(/^[.]/){ next } # skip dot-files

    when(/(.+)[.]txt$/){ say "text file: ", $1 }
    default{
      say "other file: ", $_;
    }
  }
  # $dirhandle is automatically closed here
}

或者,如果您有非常大的目录,则可以使用while循环。

{
  opendir my($dirhandle), $dir;
  while( my $elem = readdir $dirhandle ){
    given( $elem ){ # sets $_
      when(-d $_ ){ next } # skip directories
      when(/^[.]/){ next } # skip dot-files

      when(/(.+)[.]txt$/){ say "text file: ", $1 }
      default{
        say "other file: ", $_;
      }
    }
  }
}

答案 3 :(得分:2)

要获取“.txt”文件,可以使用文件测试运算符(-f:常规文件)和正则表达式。

my @files = grep { -f && /\.txt$/ } readdir $dir;

否则,您可以使用perl的-T(ascii-text file test operator)查找文本文件

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

答案 4 :(得分:2)

这是我使用glob函数找到的最简单的方法(如人类可读):

 # Store only TXT-files in the @files array using glob
 my @files = grep ( -f ,<*.txt>);
 # Write them out
 foreach $file (@files) {
  print "$file\n";
 }

此外,“ - f”确保只有实际文件(而不是目录)存储在数组中。

答案 5 :(得分:1)

请使用:

my @files = map {-f && s{\.txt\z}{} ? $_ : ()} readdir DIR;