按模式过滤文件名

时间:2009-06-11 21:00:46

标签: perl grep readdir

我需要搜索以特定模式开头的目录中的文件,比如说“abc”。我还需要消除结果中以“.xh”结尾的所有文件。我不知道如何在Perl中做到这一点。

我有这样的事情:

opendir(MYDIR, $newpath);
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK

我还需要删除以“.xh”结尾的结果中的所有文件

谢谢,毕

6 个答案:

答案 0 :(得分:7)

@files = grep {!/\.xh$/} <$MYDIR/abc*>;

其中MYDIR是一个包含目录路径的字符串。

答案 1 :(得分:7)

  

opendir(MYDIR,$ newpath);我的@files = grep(/ abc *。* /,readdir(MYDIR)); #DOES NOT WORK

你正在混淆一个带有glob模式的正则表达式模式。

#!/usr/bin/perl

use strict;
use warnings;

opendir my $dir_h, '.'
    or die "Cannot open directory: $!";

my @files = grep { /abc/ and not /\.xh$/ } readdir $dir_h;

closedir $dir_h;

print "$_\n" for @files;

答案 2 :(得分:3)

opendir(MYDIR, $newpath) or die "$!";
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR);
close MYDIR;
foreach (@files) { 
   do something
}

答案 3 :(得分:2)

kevinadc和Sinan Unur使用但未提及的一点是readdir()在列表上下文中调用时返回目录中所有条目的列表。然后,您可以使用任何列表运算符。这就是你可以使用的原因:

my @files = grep (/abc/ && !/\.xh$/), readdir MYDIR;

所以:

readdir MYDIR

返回MYDIR中所有文件的列表。

grep (/abc/ && !/\.xh$/)

返回符合条件的readdir MYDIR返回的所有元素。

答案 4 :(得分:-1)

foreach $file (@files)
{
    my $fileN = $1 if $file =~ /([^\/]+)$/;

    if ($fileN =~ /\.xh$/)
    {
          unlink $file;
          next;
    }
    if ($fileN =~ /^abc/)
    {
          open(FILE, "<$file");
          while(<FILE>)
          {
             # read through file.
          }
    }
 }

此外,可以通过执行以下操作来访问目录中的所有文件:

$DIR = "/somedir/somepath";
foreach $file (<$DIR/*>)
{
  # apply file checks here like above.
}

或者,您可以使用perl模块File :: find。

答案 5 :(得分:-1)

而不是使用opendir并过滤readdir(不要忘记closedir!),而是使用glob

use File::Spec::Functions qw(catfile splitpath);

my @files =
    grep !/^\.xh$/,                # filter out names ending in ".xh"
    map +(splitpath $_)[-1],       # filename only
    glob                           # perform shell-like glob expansion
        catfile $newpath, 'abc*';  # "$newpath/abc*" (or \ or :, depending on OS)

如果您不关心取消glob结果前缀的$newpath,请摆脱map+ splitpath