用于读取目录并具有由特定名称启动的文件名的Perl脚本

时间:2015-06-29 10:10:02

标签: regex perl perl-module regex-lookarounds perl-data-structures

我有一个包含数千个文件的目录 假设我有3个同名的pdf文件,如:

  1. sample_Q1.pdf
  2. sample_Q2.pdf
  3. sample_Q3.pdf
  4. 现在我想找到以" Sample"开头的具有特定名称的文件列表。

    我目前正在使用:

    #!/usr/bin/perl 
    use strict;
    use warnings;
    my $dir = '/home/gaurav/Desktop/CSP';
    opendir( DIR, $dir ) or die $!;
    while ( my $file = readdir(DIR) ) {
    
    # We only want files
        next unless ( -f "$dir/$file" );
    
    # Use a regular expression to find files ending in .txt
        next unless ( $file =~ /\.pdf$/ );
        print "$file\n";
    }
    
    closedir(DIR);
    exit 0;
    

4 个答案:

答案 0 :(得分:3)

我建议readdir而不是glob你真正想要的是readdir。后者以与shell相同的方式扩展模式,并返回匹配。它特别有用的原因是glob返回文件名,其中#!/usr/bin/perl use strict; use warnings; my $dir = '/home/gaurav/Desktop/CSP'; foreach my $file ( glob ( "$dir/sample*.pdf" ) ) { print $file,"\n"; } 返回完整路径。 (例如目录)。

E.g。

next unless -f $file; 

如果你想跳过任何'非文件',有两种方法:

foreach my $file ( grep { -f $_ } glob ( "$dir/sample*.pdf" ) )  {

或者:

.pdf

但这可能是一个没有实际意义的点,除非你的目录后缀为<?= ?>,这有点不寻常。

答案 1 :(得分:2)

my $DirectoryName = '......';

chdir( $DirectoryName ) or die "Can't change directory: $!\n";
my @files = glob( "sample*");
for my $file (@files) {
  print $file,"\n";
}

答案 2 :(得分:0)

这将提供以示例开头且扩展名为 .pdf 的所有文件名列表:

use warnings;
use strict;

opendir my $dir, "/home/gaurav/Desktop/CSP" or die "Can't open directory: $!";
my @files = grep { /sample.*\.pdf$/ } readdir $dir;
print "@files";
closedir $dir;

如果您想逐个打印文件名,请使用foreach循环:

foreach my $file (@files)
{
    print "$file\n";
}

答案 3 :(得分:0)

我会像下面那样做。

$file =~ /^sample.*\.pdf$/i

在这里&#39;我&#39;用于不区分大小写。它会搜索“样本”和“样本”。和&#39;示例&#39;。

while ( my $file = readdir(DIR) ) 
{

      if((-f "$dir/$file" ) && ($file =~ /^sample.*\.pdf$/i))
      {
          print "$file \n";
      }
}